1、Timeline结构介绍
首先,一个Timeline是由多个track组成。每个track又是又多个clip组成。如下图所示。这是一个动画的track。在后面,放着的idle、walk等都是一个个的动画clip。随着时间的进行,后面这些动画clip都会使用到挂在的物体上,让他做出这一个个动作。
除了track、clip之外,上图中还有behaviour。正如名字一样,他是定义行为、掌管逻辑的东西。每一个clip都有其自己的行为。比如动画clip就可以将动画的数据作用到对应的物体上,声音clip就可以控制系统中的声音,Cinemachine clip就可以控制摄像机一样,每一个clip都会跟着一个behaviour来定义其行为。
同上,上面还有一个MixerBehaviour。他定义的是两个clip片段之间的融合过度如何处理。Timeline中一个很重要的功能就是过度,上图中walk和jump两个clip就有一部分重合在了一起,当时间运行到这一部分的时候,这两个动画该怎么样同时应用到一个物体上就需要MixerBehaviour脚本来定义。
好了,做一个总结。一套完整的Timeline拓展需要自定义track、clip、clip的behaviour、MixerBehaviour。
其中Track脚本继承自TrackAsset,Clip脚本继承自PlayableAsset和ITimelineClipAsset,clip的行为脚本继承自PlayableBehaviour,MixerBehaviour也继承自PlayableBehaviour。
2、做一个Clip
先做一个普通的clip,他可以直接放在Timeline内置的playable轨道。
using System;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
[Serializable]
public class SimpleClip : PlayableAsset, ITimelineClipAsset
{
public SimpleBehaviour template = new SimpleBehaviour ();
//这个函数是将Clip与Behaviour绑定的必要函数。
public override Playable CreatePlayable (PlayableGraph graph, GameObject owner)
{
var playable = ScriptPlayable<SimpleBehaviour>.Create(graph, template);
return playable;
}
//定义clip的特性,比如blending, extrapolation, looping, etc.。是对ITimelineClipAsset接口的实现。
public ClipCaps clipCaps
{
get { return ClipCaps.None; }
}
}
其中有一个定义行为的SimpleBehaviour。
using System;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
[Serializable]
public class SimpleBehaviour : PlayableBehaviour
{
public string message;
//Timeline运行到这个Clip时,每帧都会回调的函数
public override void ProcessFrame(Playable playable, FrameData info, object playerData)
{
//里面就写每帧的逻辑
Debug.Log(message);
}
}
这样,就定义了一个Clip,他每帧就会在控制台发送一个Log。
在Timeline的Playable轨道上就可以创建这个SimpleClip
3、深入Timeline
以下的说法都是我自己的理解,