注:软件版本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。
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的结构图就变成下图所示:
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))]