转发链接
手把手教你在Unity2020中使用Timeline_linxinfa的专栏-CSDN博客
自定义timeline类型 通常需要二个类,分别集成PlayableAsset,PlayableBehaviour.
PlayableAsset 对应是用来挂在timeline上轴上得clip,下面简称Asset
PlayableBehavior对应是运行时实际操作的类,下面简称Behavior
PlayableBehavior的生命周期:
OnBehaviourPause | 出现以下某种情况之一时,将调用此方法: 遍历期间的有效播放状态更改为 PlayState.Paused。此状态由 FrameData.effectivePlayState 指示。 在可播放项播放状态为 Playing 时停止 PlayableGraph。此状态由 PlayableGraph.IsPlaying 返回的 true 结果指示。 |
OnBehaviourPlay | 在 Playable 播放状态更改为 PlayState.Playing 时调用此函数。 |
OnGraphStart | 在拥有此 PlayableBehaviour 的 PlayableGraph 启动时调用此函数。 |
OnGraphStop | 在拥有此 PlayableBehaviour 的 PlayableGraph 停止时调用此函数。 |
OnPlayableCreate | 在拥有 PlayableBehaviour 的 Playable 创建后调用此函数。 |
OnPlayableDestroy | 在拥有 PlayableBehaviour 的 Playable 销毁后调用此函数。 |
PrepareData | 在 PlayableGraph 的 PrepareData 阶段调用此函数。 |
PrepareFrame | 在 PlayableGraph 的 PrepareFrame 阶段调用此函数。 |
ProcessFrame | 在 PlayableGraph 的 ProcessFrame 阶段调用此函数。 |
我们需要在继承的Asset类实现CreatePlayable来创建我们需要的Behavior。可以在这里设置需要的参数给Behavior来让Asset的数据与其进行关联。但是需要注意在Inspector中,如果想要实现拖拽Unity对象到Inspector。需要在Asset的属性中使用ExposedRefernce。
比如ExposedReference<Transform>,要不不让你拖。
想要获取里面的Unity组件实例如下:
public override Playable CreatePlayable (PlayableGraph graph, GameObject owner) { var playable = ScriptPlayable<NoMixerTransformTweenBehaviour>.Create (graph, template); NoMixerTransformTweenBehaviour clone = playable.GetBehaviour (); clone.startLocation = startLocation.Resolve (graph.GetResolver ()); clone.endLocation = endLocation.Resolve (graph.GetResolver ()); return playable; } }
下面这个方法可以在editor下让timeline播放完并且窗口关闭,不会改变GameObject的属性
public override void GatherProperties(PlayableDirector director, IPropertyCollector driver) { #if UNITY_EDITOR var comp = director.GetGenericBinding(this) as Transform; if (comp == null) return; var so = new UnityEditor.SerializedObject(comp); var iter = so.GetIterator(); while (iter.NextVisible(true)) { if (iter.hasVisibleChildren) continue; driver.AddFromName<Transform>(comp.gameObject, iter.propertyPath); } #endif base.GatherProperties(director, driver); }
除此之外还有一个编辑起来方便的TrackAsset对应在unity是这块。
比如:
[TrackClipType(typeof(XXX_PlayableAsset))] [TrackBindingType(typeof(Transform))] public class XXXTrack : TrackAsset { }
这里第一个Type表示你可以在这条轴上右键创建什么Asset,第二个比如事例中当我拽一个GameObject上来的时候,他自动绑定Transform,其会在Behavior的ProcessFrame作为第三个参数以object传入进来。
这里可以使用CreateTrackMixer来直接管理这个trackAsset在播放时的Behavior。他的生命周期贯穿整个这条轴。这里之前不熟悉timeline遇到个坑,我这个创建的Behavior和Clip的Behavior写成一样的了,就导致Clip的赋值正确,这个mixer创建的没有赋值而疯狂报错。
如果我们想要调节轴上各个Clip是不是可以融合之类的,可以在对应的Asset继成ITimelineClipAsset,设置其 clipCaps枚举即可。
如果一个轨道想支持多种Clip,TrackAsset上的TrackClipType写的是PlayableAsset的父类,这样只需新增PlayableAsset基层写的那个就可以有多种了。