> 技术文档 > 【Unity博客节选】Timeline 静态结构分析_playabledirector的bindings使用

【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的静态结构

【Unity博客节选】Timeline 静态结构分析_playabledirector的bindings使用

在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。如下:

【Unity博客节选】Timeline 静态结构分析_playabledirector的bindings使用

【Unity博客节选】Timeline 静态结构分析_playabledirector的bindings使用

这个扩展名为 \".playable\"的 timeline 文件,就是所谓的静态资产。

timeline资产文件实例化后就是TimelineAsset类,TimelineAsset下一层是TrackAsset,TrackAsset包含数个PlayableAsset(比如AnimationPlayableAsset、AudioPlayableAsset等)。

结构图如下:

【Unity博客节选】Timeline 静态结构分析_playabledirector的bindings使用

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

【Unity博客节选】Timeline 静态结构分析_playabledirector的bindings使用
【Unity博客节选】Timeline 静态结构分析_playabledirector的bindings使用

实例化时,会根据这个yaml文件解析成 PlayableAsset节点链(利用PlayableAsset的parentchildren参数),根节点(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。

【Unity博客节选】Timeline 静态结构分析_playabledirector的bindings使用

红框为root track,黄框为output track

PlayableDirector

用Timeline窗口查看timeline资产有两种方式,产生的效果会不同:

  • 第一种是从Project窗口打开的独立timeline资产,它无法预览播放,track左侧也没有绑定对象;
  • 另一种就是从挂载PlayableDirector组件对象点开,那么它的timeline就是可预览播放的,track左侧也会显示Bindings

第二种其实就是PlayableDirector组件做的绑定。
【Unity博客节选】Timeline 静态结构分析_playabledirector的bindings使用

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

【Unity博客节选】Timeline 静态结构分析_playabledirector的bindings使用

PlayableDirector组件中SceneBindings值

这样,包含PlayableDirector的结构图就变成下图所示:

【Unity博客节选】Timeline 静态结构分析_playabledirector的bindings使用

包含PlayableDirector的TimelineAsset结构图

PlayableAsset UML类图

TrackAssetTimelineAsset 其实都是继承自PlayableAsset,是一种特殊的PlayableAsset

PlayableAsset UML类图如下图所示:

【Unity博客节选】Timeline 静态结构分析_playabledirector的bindings使用

  • TimelineAsset:最特别的PlayableAsset,存储了所有trackAsset,包含一个CreatePlayable方法,指导运行时创建TimelinePlayable
  • ClipPlayableAsset(蓝色) :表示实现ITimelineClipAsset接口的特殊PlayableAsset,具体类有ActivationPlayableAssetAudioPlayableAssetAnimationPlayableAssetControlPlayableAsset。这些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输入。
  • TrackAssetCompileClips方法在运行时编译其所包含的所有clip,生成RuntimeClip并加入到TimelinePlayableIntervalTree中,用于Timeline运行时标识哪个clip被激活。
  • 继承TrackAsset的类有GroupTrack、ActivationTrack、AudioTrack、ControlTrack、SignalTrack、AnimationTrack等,这与timeline窗口能添加的track一致。
  • TrackAsset 有两个特性(Attribute
    • TrackClipType:表明Track能添加的clip类型,也就是上面继承playable且实现ITimelineClipAsset接口的类。
    • TrackBindingType :表明 output Track对应的PlayableOutputtarget参数类型,也即PlayableBindingoutputTargetType参数。
[TrackClipType(typeof(AnimationPlayableAsset)][TrackBindingType(typeof(Animator))]