前言
Unity Timeline是Unity的一种时间轴编辑器工具,用于制作和管理游戏中的动画、剧情以及事件触发。它提供了直观的界面,使得开发者可以通过拖放操作轻松创建和编辑时间轴。
Timeline的使用
-
创建新的Timeline
在Unity中,选择菜单栏的 Window -> Sequencing -> Timeline 打开Timeline窗口。
在Hierarchy视图中右键,选择 Create -> Timeline 创建一个新的Timeline对象。 -
时间轴基础操作
添加轨道 (Tracks):在Timeline窗口中右键空白处,选择 Add Tracks,可以添加诸如动画、音频、事件等各种轨道。
添加关键帧 (Keyframe):在轨道上右键,选择 Add Key,用于设置轨道上物体的不同状态。
调整时间范围:可以在时间轴的上方调整整个Timeline的时间范围,也可以在轨道上调整各个轨道的时间范围。
轨道介绍
Activation Track:用于控制物体的激活状态。可以在轨道上添加关键帧,控制物体的激活和非激活状态。
Animation Track:用于处理物体的动画。可以在此轨道上添加关键帧,编辑物体的动画状态。
Audio Track:用于处理场景中的音频。可以管理音频的播放、暂停、淡入淡出等操作。
Control Track:用于控制在时间轴上放置Prefab,并由Timeline管理Prefab对象的创建与销毁(即,生命周期)。
Playable Track:用于嵌套其他Timeline。可以在此轨道上添加其他Timeline,实现Timeline的嵌套播放。
Signal Track:用于触发自定义的事件。可以在轨道上添加关键帧,触发事件。
自定义轨道
Unity中的TimeLine支持自定义轨道,一般需要新建三个(若需要处理混合则为四个)类。
一、Track
1、用途
首先需要定义一个轨道类,继承TrackAsset,它代表了时间轴内的轨道。官方API
2、代码示例
[TrackColor(0.055f, 0.03f, 0.387f)]
[TrackClipType(typeof(MyClip))]
[TrackBindingType(typeof(Animator))]
public class MyTrack : TrackAsset
{
[SerializeField] int blendingDuration = 200;
protected override Playable CreatePlayable(PlayableGraph graph, GameObject gameObject, TimelineClip clip)
{
var asset = clip.asset as MyClip;
asset.duration = blendingDuration;
return base.CreatePlayable(graph, gameObject, clip);
}
}
3、轨道类可以被三种特性标签修饰
[TrackColor(float r, float g, float b)]
用于定义轨道的颜色,方便不同轨道之间的区分;
[TrackClipType(Type clipClass)]
用于指定在轨道中可创建的PlayableAsset类型,可以理解实现了轨道类型和片段类型之间的绑定,同一个轨道可以添加多种不同的片段类型,及可以有多个TrackClipType
修饰同一个轨道类;
[TrackBindingType(Type type)]
用于指定轨道需要绑定到的对象类型,如示例中的LookAtTrack
是用于控制某个角色上的头部动画,因此需要绑定一个角色的Animator组件。若改轨道不需要绑定特定对象,则不需要添加该标签。
4、常用方法
protected override Playable CreatePlayable(PlayableGraph graph, GameObject gameObject, TimelineClip clip)
protected override void OnCreateClip(TimelineClip clip) 在新建片段时调用用于设置Clip的默认值。
public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount)当片段之间支持混合时可添加该方法。
二、Asset
1、用途
接着定义一个继承PlayableAsset、实现接口ITimelineClipAsset的类,用于表示片段资源,该类中可以定义片段包含的字段,这些字段会暴露到Inspector中。
2、代码示例
public class MyClip : PlayableAsset, ITimelineClipAsset
{
public string content;
public ExposedReference<Transform> target;
public DialogueBehaviour template = new MyBehaviour();
public ClipCaps clipCaps
{
get { return ClipCaps.None; }
}
public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
{
var playable = ScriptPlayable<MyBehaviour>.Create(graph, template);
var myBehaviour = playable.GetBehaviour();
myBehaviour.content = content;
myBehaviour.target = target;
return playable;
}
}
3、常用方法
通常该类中会重写CreatePlayable()方法,常用于实现该类和Behaviour类之间的数据传递,关于
ScriptPlayable 和 PlayableBehaviour的使用 可参考 ScriptPlayable 和 PlayableBehaviour
三、Behaviour
1、用途
接着定义一个Behaviour类继承PlayableBehaviour用于描述片段中触发的行为。官方API
2、代码示例
public class MyBehaviour : PlayableBehaviour
{
private bool clipPlayed = false;
private bool pauseScheduled = false;
private PlayableDirector director;
public override void OnPlayableCreate(Playable playable)
{
director = (playable.GetGraph().GetResolver() as PlayableDirector);
}
public override void OnBehaviourPlay(Playable playable, FrameData info)
{
if (!clipPlayed && info.weight > 0f)
{
if (Application.isPlaying) pauseScheduled = true;
clipPlayed = true;
}
}
public override void OnBehaviourPause(Playable playable, FrameData info)
{
if (pauseScheduled)
{
pauseScheduled = false;
clipPlayed = false;
director.Pause();
}
}
}