文章目录
一、关于Timeline二、安装Timeline三、如何创建一个Timeline资源1、方法一(该方法需手动添加Playable Director组件)2、方法二(该方法会自动添加Playable Director组件)
三、创建轨道四、具体轨道的使用1、Activation Track轨道2、Animation Track轨道2.1、用法一:直接使用Animation Track来录制动画2.2、用法二:播放已制作好的Animation Clip
3、Audio Track轨道3.1、 导入音效资源3.2、将音效资源拖入到轨道中3.3、可在轨道上对音效做简单的编辑
4、Control Track轨道4.1 控制粒子特效4.2 嵌套Timeline
5、Signal Track轨道5.1、 响应信号的物体和脚本5.2、创建Signal Track轨道,设置响应物体5.3、创建信号发射器Signal Emitter5.4、给信号发射器设置响应函数5.5、运行效果
6、Playable Track轨道6.1、PlayableAsset和PlayableBehaviour脚本6.2、将PlayableAsset拖到轨道上6.3、动态设置PlayableAsset参数6.4、运行效果
五、答疑1、Timeline如何实现倒放待续
一、关于Timeline
Timeline是一套基于时间轴的多轨道动画系统,它支持可视化编辑,实时预览。 这一个技术相对于其他动画系统,最大的区别就是,Timeline可以针对多个游戏物体做出的一系列动画,主要用于过场动画的制作,实现电影级的那种分镜效果。
二、安装Timeline
打开Package Manager,安装TimeLine,Unity2020默认是安装了TimeLine的,可以通过Package Manager进行更新。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903083626187.png?x-oss-process=/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpbnhpbmZh,size_16,color_FFFFFF,t_70#)
三、如何创建一个Timeline资源
1、方法一(该方法需手动添加Playable Director组件)
在Project视图中,右键菜单 - Create - Timeline 即可创建Timeline资源(格式为.playable) 但这种方式创建的Timeline资源是没有被引用的,需要通过Playable Director组件来引用这个Timeline资源,从而播放它。 我们可以给某个物体手动添加Playable Director组件,然后引用Timeline资源。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903085633585.png?x-oss-process=/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpbnhpbmZh,size_16,color_FFFFFF,t_70#)
2、方法二(该方法会自动添加Playable Director组件)
点击Unity菜单Window - Sequencing - Timeline 此时会打开Timeline窗口,并提示你选择一个物体:To start creating a timeline, select a GameObject 当我们选中Hierachy视图中的某个物体后,Timeline窗口中会出现一个Create按钮 点击Create按钮即可创建Timeline资源(格式为.playable) 我们还会发现,我们选中的物体,自动挂了Playable Director组件,并自动引用了Timeline资源 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903085217152.png?x-oss-process=/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpbnhpbmZh,size_16,color_FFFFFF,t_70#)
三、创建轨道
在Timeline窗口左侧栏右键菜单,可以创建多种轨道 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020090309014396.png?x-oss-process=/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpbnhpbmZh,size_16,color_FFFFFF,t_70#)
轨道描述Track Group将不同的轨道进行分类,相当于文件夹功能Activation Track控制物体的显示和隐藏Animation Track为物体加入动画,可以在场景中方便地录制动画,也可以是已经制作好的Animation ClipAudio Track为动画添加音效,并可对音效进行简单的裁剪和操作Control Track在该轨道上可以添加粒子效果,同时也可以添加子Timeline进行嵌套Signal Track信号轨道,可以发送信号,触发响应信号的函数调用Playable Track在该轨道中用户可以添加自定义的播放功能
四、具体轨道的使用
1、Activation Track轨道
这个轨道是控制物体的显示和隐藏的,使用很简单,创建Activation Track轨道后,把需要控制的物体拖到物体槽中,比如下面是控制一个正方体(Cube)的显示与隐藏,效果如下。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903091915612.gif#)
2、Animation Track轨道
Animation Track轨道可以为物体加入动画,可以在场景中方便地录制动画,也可以是已经制作好的Animation Clip。
2.1、用法一:直接使用Animation Track来录制动画
将物体拖动到Animation Track的物体槽中时,如果物体没有Animator组件,会提示为物体挂一个Animator组件。 比如这里,我们要给一个Cube录制动画,点击Create Animator on Cube。 接着,点击录制按钮,即可开始录制动画 我们做一个简单的位移动画录制 我们还可以在轨道上右键菜单 - Edit in Animation Window,打开Animation窗口来编辑动画 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903093912976.png?x-oss-process=/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpbnhpbmZh,size_16,color_FFFFFF,t_70#)
2.2、用法二:播放已制作好的Animation Clip
首先,我们给Cube创建一个Animation动画 把Cube拖到Animation Track的物体槽中 然后在轨道上右键菜单 - Add From Animation Clip,选择我们上面制作好的Animation动画 即可使用Animation Track轨道来播放Animation Clip了 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903095131880.gif#)
3、Audio Track轨道
Audio Track为动画添加音效,并可对音效进行简单的裁剪和操作。
3.1、 导入音效资源
首先,在工程中导入一个test.ogg音效资源 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903100752410.png?x-oss-process=/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpbnhpbmZh,size_16,color_FFFFFF,t_70#)
3.2、将音效资源拖入到轨道中
在Timeline中创建Audio Track轨道,然后再轨道上右键菜单 - Add From Audio Clip, 选择我们上面导入的test.ogg资源 即可在轨道上看到资源音轨 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903101055662.png?x-oss-process=/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpbnhpbmZh,size_16,color_FFFFFF,t_70#)
3.3、可在轨道上对音效做简单的编辑
我们可以对音轨做裁剪 还可以将音轨做分割 分割成两个片段 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903101453725.png#)
4、Control Track轨道
Control Track轨道可以添加粒子效果,同时也可以添加子Timeline进行嵌套。
4.1 控制粒子特效
先创建一个粒子 然后将粒子拖到Control Track轨道中(或者在轨道上右键菜单 - Add From Game Object,然后选择对应的粒子GameObject) 即可使用Control Track轨道播放粒子 有趣的是,我们还可以在轨道上倒放预览粒子 甚至对粒子做裁切分割 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903103212159.png?x-oss-process=/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpbnhpbmZh,size_16,color_FFFFFF,t_70#)
4.2 嵌套Timeline
先创建一个SubTimeline,在SubTimeline中控制Cube移动 在后在原来的Timeline(主Timeline)中创建Control Track轨道,并把SubTimeline(子Timeline)拖动到轨道中,这样,就实现了Timeline嵌套 效果如下 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903111422574.gif#)
5、Signal Track轨道
Signal Track信号轨道,可以发送信号,触发响应信号的函数调用。
5.1、 响应信号的物体和脚本
在Hierachy中创建一个空物体,重名名为SignalReceiver 创建一个C#脚本SignalTest.cs,挂到上面的物体上(会自动绑定挂上SignalReceiver组件),用于响应信号 代码如下:
using UnityEngine;
using UnityEngine.Timeline;
[RequireComponent(typeof(SignalReceiver))]
public class SignalTest : MonoBehaviour
{
// 信号的响应函数
public void OnReceiveSignal()
{
Debug.Log("OnReceiveSignal: Hello Signal");
}
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903134312212.png?x-oss-process=/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpbnhpbmZh,size_16,color_FFFFFF,t_70#)
5.2、创建Signal Track轨道,设置响应物体
在Timeline中创建Signal Track信号轨道 将SignalReceiver物体拖到信号轨道的物体槽中 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903114424953.png?x-oss-process=/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpbnhpbmZh,size_16,color_FFFFFF,t_70#)
5.3、创建信号发射器Signal Emitter
创建一个信号发射器资源(Signal Emitter),在Project视图右键菜单 - Create - Signal 将信号发射器拖到轨道上 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903134750911.png?x-oss-process=/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpbnhpbmZh,size_16,color_FFFFFF,t_70#)
5.4、给信号发射器设置响应函数
点击轨道上的信号发射器,在Inspector视图中会显示信号信息,Add Reaction按钮,添加信号的响应函数 默认信号接收对象就是SignalReceiver组件所在的物体 点击No Function可以列出物体上的组件和组件中的所有public属性和方法,这里我们设置响应函数为SignalTest脚本的OnReceiverSignal函数。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903135318757.png?x-oss-process=/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpbnhpbmZh,size_16,color_FFFFFF,t_70#)
5.5、运行效果
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020090314005160.gif#)
6、Playable Track轨道
在Playable Track轨道,可以添加自定义的播放功能。
6.1、PlayableAsset和PlayableBehaviour脚本
需要写两个类,一个继承PlayableAsset,一个继承PlayableBehaviour。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903142018583.png#)
using UnityEngine;
using UnityEngine.Playables;
public class MoveObjPlayableAsset : PlayableAsset
{
public GameObject go;
public Vector3 pos;
public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
{
var bhv = new MoveObjPlayableBehaviour();
bhv.go = go;
bhv.pos = pos;
return ScriptPlayable.Create(graph, bhv);
}
}
using UnityEngine;
using UnityEngine.Playables;
public class MoveObjPlayableBehaviour : PlayableBehaviour
{
public GameObject go;
public Vector3 pos;
public override void OnGraphStart(Playable playable)
{
base.OnGraphStart(playable);
Debug.Log("OnGraphStart=======================");
}
public override void OnGraphStop(Playable playable)
{
base.OnGraphStop(playable);
Debug.Log("OnGraphStop=======================");
}
public override void OnBehaviourPlay(Playable playable, FrameData info)
{
// 这里的逻辑是改变物体的坐标,具体逻辑就看具体需求
base.OnBehaviourPlay(playable, info);
Debug.Log("OnBehaviourPlay=======================");
if (null != go)
{
go.transform.position = pos;
}
}
public override void OnBehaviourPause(Playable playable, FrameData info)
{
base.OnBehaviourPause(playable, info);
Debug.Log("OnBehaviourPause=======================");
if (null != go)
{
go.transform.position = Vector3.zero;
}
}
public override void OnBehaviourDelay(Playable playable, FrameData info)
{
base.OnBehaviourDelay(playable, info);
Debug.Log("OnBehaviourDelay=======================");
}
}
6.2、将PlayableAsset拖到轨道上
将MoveObjPlayableAsset脚本直接拖动到PlayableTrack轨道上,具体的脚本逻辑在MoveObjPlayableBehaviour中实现,本例是设置物体的坐标 点击轨道上的MoveObjPlayableAsset,可以在Inspector视图中看到对应的参数 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903144145745.png?x-oss-process=/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpbnhpbmZh,size_16,color_FFFFFF,t_70#)
6.3、动态设置PlayableAsset参数
现在,我们另外写一个脚本(Runner.cs),运行的时候动态地给MoveObjPlayableAsset设置GO对象。 首先我们将轨道名字改成MyPlayableTest,因为下面的代码需要通过名字来获取改轨道对象。 把Runner.cs脚本挂到Timeline物体上,并赋值Timeline变量和Cube变量,如下 Runner.cs代码如下
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
public class Runner : MonoBehaviour
{
public PlayableDirector timelinePlayer;
public GameObject cube;
void Start()
{
var timeline = timelinePlayer.playableAsset;
foreach (var binding in timeline.outputs)
{
// 轨道名
var trackName = binding.streamName;
if ("MyPlayableTest" == trackName)
{
// 轨道
var track = binding.sourceObject as TrackAsset;
// 轨道上的片段,每个片段都是PlayableAsset的子类
var clipList = track.GetClips();
foreach (var clip in clipList)
{
if (clip.asset is MoveObjPlayableAsset)
{
var moveObjPlableAsset = clip.asset as MoveObjPlayableAsset;
// 动态设置go对象的坐标
moveObjPlableAsset.go = cube;
moveObjPlableAsset.pos = new Vector3(-4.91f, 0, 0);
break;
}
}
}
}
}
}
6.4、运行效果
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200903152158287.gif#)
五、答疑
1、Timeline如何实现倒放
先看下正放的效果: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210326173205639.gif)
我们可以通过PlayableDirector的time属性,从大到小,即可实现倒放,例:
using UnityEngine;
using UnityEngine.Playables;
public class Runner: MonoBehaviour
{
public PlayableDirector timelinePlayer;
private double m_timer;
void Start()
{
// 获取总时长
m_timer = timelinePlayer.duration;
timelinePlayer.Play();
}
void Update()
{
// 倒放
if (m_timer > 0)
m_timer -= Time.deltaTime;
timelinePlayer.time = m_timer;
}
}
运行Unity,倒放效果如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210326173909330.gif)
待续
欢迎评论区提问
|