我使用的是Unity 2020.3.25,TimeLine版本是1.5.2。
TimeLine可以添加以下几种Track
1.Activation Track一般用来控制GameObject的显示和隐藏
例如通过控制CineMachine的相机显隐实现镜头切换
2.Animation Track控制动画的播放或录制动作
a.角色的动画切换,可以理解为另一种状态机
将主角拖入新建的 Animation Track,再讲角色对应Clips拖入序列帧,可以控制动画播放的长度及混合情况。
b.录制位置、旋转、缩放等动画(“小红点”左边的“线段”可以展开动画曲线)
点击新建的Animation Track右边小红点,进入录制状态,在需要录制的GameObject对象上,右击Add Key
如果对录制好的动画进行修改,可以选择Update Key
使用方式和Animation动画的录制相似
3.Audio Track主要是控制音频的播放和切换,同时音频也可设置混合。
4.Control Track没有暴露属性。
5.Signal Track类似动画的帧事件(Event),可以在特定帧触发事件的回调
首先场景中需要创建一个Signal Receiver事件接收器,再创建一个Signal文件,设置Runtime Only对象及对应的回调函数。
Signal我这边保存在Assets目录下了。
之后将场景中的Signal Emitter拖到新建的Signal Track里,再将Assets目录下的Signal拖到对应的帧上。当运行到当前帧时,就会触发里面的回调函数。
6.Playable Track自定义轨道
Playable Track不能往里面添加任何Clip。这是因为这个轨道里面放置的是自定义Clip,需要通过代码来实现。
下面通过一个小栗子来阐述。现在咱们定个小目标:通过自定义Clip修改灯光的颜色和亮度(当然了,这个功能可以通过Animation Track实现,但是我偏不用)。我们是为了学习自定义Clip,所以用自定义Clip来实现。
创建自定义clip需要二个脚本:
下面会用到Playable API,Playable API的核心原则是分离逻辑和数据。
我们先创建一个脚本继承PlayableBehaviour,在这个脚本里编写处理的逻辑。处理的逻辑是啥呢?实际上就是随着Timeline的时间变化,这个clip会如何变化。代码如下:
using UnityEngine;
using UnityEngine.Playables;
public class LightControlBehaviour : PlayableBehaviour
{
public Light light = null;
public Color color = Color.white;
public float intensity = 1f;
public override void ProcessFrame(Playable playable, FrameData info, object playerData)
{
if (light != null)
{
light.color = color;
light.intensity = intensity;
}
}
}
这个代码有啥作用呢?首先它确定需要修改Light组件的哪些属性。
然后重写了PlayableBehaviour的ProcessFrame方法。ProcessFrame会在Timeline每帧更新的时候调用。在这个方法中,你可以修改Light组件的属性。
接下来为自定义clip创建PlayableAsset,用来保存数据,代码如下:
using UnityEngine;
using UnityEngine.Playables;
public class LightControlAsset : PlayableAsset
{
public ExposedReference light;
public Color color = Color.white;
public float intensity = 1.0f;
public override Playable CreatePlayable (PlayableGraph graph, GameObject owner)
{
var playable = ScriptPlayable.Create(graph);
var lightControlBehaviour = playable.GetBehaviour();
lightControlBehaviour.light = light.Resolve(graph.GetResolver());
lightControlBehaviour.color = color;
lightControlBehaviour.intensity = intensity;
return playable;
}
}
你会发现Playable API为了实现数据和逻辑的分离,稍微有些麻烦,代码量还是比较大的。
PlayableAsset有两个目的。
CreatePlayable
方法中第一行代码如下:
var playable = ScriptPlayable.Create(graph);
这行代码会为graph添加自定义行为LightControlBehaviour,这样就可以在PlayableBehaviour设置Light的属性。
LightControlAsset类的成员属性中ExposedReference的作用是什么呢?因为PlayableAsset是个资源,它不能直接引用场景中的对象。此时ExposedReference会讲Light作为一个属性暴露出来,可以在Timeline中设置它,然后在CreatePlayable中可以使用该对象。
现在就可以在Timline中添加Playable Track,然后右键点击该新轨道添加自定义clip,菜单中会显示刚才添加的自定义Clip。
Add From Light
可以从场景中选择一个Light添加Add Light Control Asset
可以直接添加一个clip,然后选中clip后,将Light组件指定给clip,就可以预览结果了。内置Playable Track是个接收自定义Clip的通用轨道,它能接收简单的自定义Playable clip,例如上面的那个例子。对于较复杂的情况,还可以使用自定义轨道。
7.Cinemachine Track对相机的系列操作,镜头切换也可用这个。
TimeLine各种轨道使用比较灵活,同样的效果可能会有多种实现方式,找到适合的即可。
工程截图如下: