【Unity博客节选】Timeline 静态结构分析_playabledirector的bindings使用
注:软件版本Unity 6.0 + Timeline 1.8.7
作者:CSDN @ RingleaderWang
原文:《Unity第25期——Timeline结构及其源码浅析》
文章首发Github👍:《Timeline结构及其源码浅析》
Bilibili 视频版👍👍:《Timeline结构及其源码解析》https://www.bilibili.com/video/BV1bHjYzNE35
Timeline 静态结构分析
后面我们会了解到,在运行时,timeline会生成树形结构的PlayableGraph,那谁指导它生成呢?就是PlayableAsset,这即是Timeline的静态结构。

在Timeline窗口编辑资产后,形成资产树(也是树形结构的,根节点是TimelinePlayable,下一层是root track/output track,再下一层是 PlayableAsset)。
PlayableDirector添加timeline资产,然后设置binding后 ,director就能管理整个timeline资产了。
等后面director组件初始化 ,并根据timeline资产树实例化为对应的TimelineAsset后,便能以有序生成各个Playable。
所以想理解运行时Timeline就必须先搞明白 静态Timeline的结构,并理清各PlayableAsset类的关系,以及clip和track、playTarget与track的关系(即Binding)。
PlayableAsset 静态资产
在Timeline窗口创建两个Track(Activation Track、Audio Track),并分别添加对应的clip。如下:


这个扩展名为 \".playable\"的 timeline 文件,就是所谓的静态资产。
timeline资产文件实例化后就是TimelineAsset类,TimelineAsset下一层是TrackAsset,TrackAsset包含数个PlayableAsset(比如AnimationPlayableAsset、AudioPlayableAsset等)。
结构图如下:

对应的Timeline.playable yaml文件如下图所示:


实例化时,会根据这个yaml文件解析成 PlayableAsset节点链(利用PlayableAsset的parent、 children参数),根节点(Root PlayableAsset)是TimelineAsset,下一层是Root Track,对于Group track或者AnimationTrack允许其下还有SubTrack,每个Track都可以包含数个PlayableAsset。
root PlayableAsset:就是TimelineAsset,是所有root track的父级节点。root track:就是TimelineAsset的直接子track,从timeline窗口看就是最外层track。output track: 会生成PlayableOutput的track。除 GroupTrack、subGroupTrack、override track外的所有track 都是 output track。

红框为root track,黄框为output track
PlayableDirector
用Timeline窗口查看timeline资产有两种方式,产生的效果会不同:
- 第一种是从Project窗口打开的独立timeline资产,它无法预览播放,track左侧也没有绑定对象;
- 另一种就是从挂载
PlayableDirector组件对象点开,那么它的timeline就是可预览播放的,track左侧也会显示Bindings。
第二种其实就是PlayableDirector组件做的绑定。

PlayableDirector利用key-value来实现绑定。key就是Track对象(在PlayableBinding中被称作sourceObject).value就是目标对象(在PlayableOutput中被称作target),如ActivationTrack对应的就是待控制的预制体,AudioSourceTrack对应的就是Audio Source组件 ,AnimationTrack 对应的就是Animator。

PlayableDirector组件中SceneBindings值
这样,包含PlayableDirector的结构图就变成下图所示:

包含PlayableDirector的TimelineAsset结构图
PlayableAsset UML类图
TrackAsset 和 TimelineAsset 其实都是继承自PlayableAsset,是一种特殊的PlayableAsset。
PlayableAsset UML类图如下图所示:

- TimelineAsset:最特别的
PlayableAsset,存储了所有trackAsset,包含一个CreatePlayable方法,指导运行时创建TimelinePlayable。 - ClipPlayableAsset(蓝色) :表示实现
ITimelineClipAsset接口的特殊PlayableAsset,具体类有ActivationPlayableAsset、AudioPlayableAsset、AnimationPlayableAsset、ControlPlayableAsset。这些PlayableAsset拥有一个clipCaps属性,表明这个片段在Timeline窗口拥有的能力,这些能力包含:Looping循环Extrapolation外推断,分Pre和post,表示两个clip中间空白区域的播放逻辑:- none 保持为开始帧
- hold 保持为最后一帧
- loop 循环(跳帧循环)
- pingpong 镜像循环
- continue 根据动画源文件的loop决定是连续循环还是保持为最后一帧
ClipIn起始裁切SpeedMultiplier倍速blend混合
- PlayableAsset都包含一个
CreatePlayable方法,用于运行时创建对应的Playable。 TrackAsset(左下黄色) 拥有CreateTrackMixer方法,运行时也是创建Playable(重写CreateTrackMixer方法的话可以创建自定义MixerPlayable),可以接收多个input输入。- TrackAsset 的
CompileClips方法在运行时编译其所包含的所有clip,生成RuntimeClip并加入到TimelinePlayable的IntervalTree中,用于Timeline运行时标识哪个clip被激活。 - 继承
TrackAsset的类有GroupTrack、ActivationTrack、AudioTrack、ControlTrack、SignalTrack、AnimationTrack等,这与timeline窗口能添加的track一致。 - TrackAsset 有两个特性(Attribute)
TrackClipType:表明Track能添加的clip类型,也就是上面继承playable且实现ITimelineClipAsset接口的类。TrackBindingType:表明output Track对应的PlayableOutput其target参数类型,也即PlayableBinding的outputTargetType参数。
[TrackClipType(typeof(AnimationPlayableAsset)][TrackBindingType(typeof(Animator))]


