【Unity3d】【Timeline】Timeline的使用研究

1. Playable相关内容梳理

  • struct PlayableGraph:
    • playable相关的图(graph)
    • 管理playable的创建和销毁
    • 图:节点和边
      • 节点:playable
        • 权重
        • influence
      • 边:connection
        • 产生链接:Connect: output -> input
        • 断开链接:DisConnect::input -> output
        • mix: 节点列表,每个节点的权重
    • 播放相关:
      • Play
      • Stop
      • IsPlaying,IsDone
      • Envaluate
    • 参数相关:
      • GetResolver
      • SetResolver
    • 生命周期相关:
      • Create
      • Destroy
  • struct Playable: 文档中有详细的描述与playableGraph的关系,和playableOutput是什么
    • 描述
      • playables可以被PlayableGraph链接在一起,生成复杂的行为(behaviours)
      • 是可定制的运行时objects
      • Playables可以被用来生成复杂的和灵活的数据Evaluation Trees.
      • Playables是graph的节点,被connected之后,可以为每个playable节点设置weight和influence
    • playableGraph描述
      • 输出PlayableOutput:一个PlayableGraph可以有多个输出,输出也被称为“players”,输出实现了IPlayableOutput接口。
        • PlayableOutput将source playable的结果应用于场景中的Object. (将playable的计算结果,应用到object上)
          • 举例说明,AnimationPlayableOutput, 将graph中的source playable(动画帧曲线) 结算结果应用到场景中的Animator上。当graph播放,动作pose就是graph的evaluation结果,被应用到Animator上。
    • ScriptPlayable:特殊类型的Playable
      • T为可定制的playable.(即,可以定制如何进行计算)
      • T必须继承子PlayableBehaviour。进而playableBehaviour中,可以制定某个时刻如何在graph中采样。
    • 联系:
      • 当一个PlayableGraph播放了,每个PlayableOutput都会被遍历。
      • 在遍历期间,会调用每个Playable的PrepareFrame方法。这样,Playable就可以自己准备下一次的采样。
      • 在PrepareFrame阶段,每个Playable都可以修改自己的children(增加新输入,或者删除输入)。这样,使得在运行时 Playable tree可以动态生成新的children分支。
      • 一旦准备阶段结束,PlayableOutputs开始负责处理结果,这就是为什么输出被称为players.比如,一个AnimationPlayableOutput,Animator负责处理graph的计算结果如何表现。对于一个ScriptPlayableOutput,PlayableBehaviour.ProcessFrame会被在每个ScriptPlayable中调用。

2. Timeline的使用

1.PlayableDirector组件:
  • 用于读取TimelineAsset数据,执行TimelineAsset的数据。
  • 文档中的Timeline instance,实际就是指一个PlayableDirector实例组件。
  • PlayableDirector将数据和表现联系起来
  • TimeLineWindow修改的是TimelineAsset数据。
  • 同一个TimelineAsset可以同时被多个PlayableDirector播放使用。
  • Bindings:
    • 每个Track的绑定Object。
    • PlayableBinding: TimelineAsset(PlayableAsset)的outputs,用于与表现联系:
      • sourceObject: TimelineAsset中,是TrackAsset
        • eg.AnimationTrack,或者ActivitionTrack.
      • streamName: TimelineAsset中,是Track的名字。
      • sourceBingdingType: TimelineAsset中,是当前Track的绑定Object的类型。
        • eg. AnimationTrack的是Animator;ActivitionTrack的绑定类型是GameObject.
  • 设置PlayableDirector的Binding:
    • Bingding是什么:
      • 是TrackAsset绑定的Object。 一个TrackAsset只能绑定一个。
    • 使用情景:TimelineAsset的Track中有binding object,动态指定
    • 使用方式:
      • 遍历PlayableAsset.outputs,根据每一个output(PlayableBinding)需要的sourceObject/streamName/sourceBindingType进行Bingding
      • playableDirector.SetGenericBinding(output.sourceObject,TargetObject);
  • 设置PlayableDirector的ReferenceValue
    • ReferenceValue是什么
      • 是PlayableAsset(ClipAsset)中,可能引用到的场景中的Object实例
      • 每个ClipAsset可以引用多个。
    • 使用情景:
      • 某个ClipAsset中,需要动态设置一个target GameObject
    • 使用方式
      • 遍历PlayableAsset.outputs,根据每一个output(PlayableBinding)需要的sourceObject/streamName/sourceBindingType进行类型判断
      • playableDirector.SetReferenceValue(new PropertyName(id/name/other),targetObject)
      • 获取的时候,在clipAsset中,设置ExposedReference refValue
        • refValue.exposedName = “传入的name”
        • T tInst = refValue.Resolve(graph.GetResolver())
2. Markers 发送通知(2019.1添加)
  • 注意:
    • 在Head area,通知的接收者是PlayableDirector所在的GameObject
    • 如果在Track中,通知的接收者是binding的Object
  • 观察者模式: observer - notification
3. Timeline Signals触发事件:
  • 扩展Marker,得到的Track-Clip-Behaviour

3. 结构梳理

  • 数据 - asset
  • 逻辑 - behaviour/playableDirector
  • 数据计算-playable/playablegraph
  1. 数据:
    • TimelineAsset
    • TrackAsset
    • PlayableAsset
  2. 逻辑
    • PlayableDirector - playableAsset(timeline asset)
    • PlayableBehaviour - playableAsset

参考资料:

  1. https://blog.unity.com/technology/extending-timeline-a-practical-guide
  2. https://docs.unity3d.com/Packages/[email protected]/manual/tl_about.html
  3. https://docs.unity3d.com/Manual/Playables.html
  4. https://docs.unity3d.com/Manual/Playables-Graph.html
  5. https://blog.unity.com/technology/unity-2017-1-feature-spotlight-playable-api
  6. https://github.com/UnityTechnologies/ATerribleKingdom
  7. https://blog.unity.com/technology/how-to-create-custom-timeline-markers
  8. https://github.com/Unity-Technologies/TimelineMarkerCustomization
  9. https://docs.unity3d.com/Packages/[email protected]/api/UnityEngine.Timeline.Marker.html
  10. https://blog.unity.com/technology/creative-scripting-for-timeline
  11. https://blog.unity.com/technology/how-to-use-timeline-signals

猜你喜欢

转载自blog.csdn.net/yanchezuo/article/details/125219879