Timeline学习

转发链接

手把手教你在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基层写的那个就可以有多种了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值