如何在Timeline中创建自定义轨道?

你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周的学习总结报告哦。

用过一段时间Timeline后,我问大智:“Timeline中只有这么几个轨道么?我发现有的需求这些轨道根本没办法满足,使用之前学过的Playable Track也很麻烦,还有其他办法么?”

大智:“你遇到了什么问题呢?”

小新:“之前咱们学的那个Playable轨道其中一个问题是:每次添加自定义clip时,都需要给它指定Light组件,如果Clip很多,会非常麻烦。”

大智:“这个还好,不算个大问题,多选就能一次搞定。不过你可能更需要的是自定义轨道。使用自定义轨道有几个好处:”
1、可以发挥你的脑洞,用代码实现出无限的可能
2、可以解决轨道的绑定(如下图中的Bound object)问题,只需要绑定一次,轨道上的所有Clip都可以访问。比如Animation Track、Activation Track都是这样的。
3、Playable Track上如果混用很多类型的Clip时,最后会很混乱,也不直观。自定义轨道可以直观地将不同用途的轨道区分开。

轨道的结构图

那我们来看看如何把之前学习Playable轨道时的自定义Light Clip改成自定义轨道,然后绑定Light组件。

注意下面是基于之前的Playable轨道这一节学习的,如果还没学习,建议先去学习Playable轨道

自定义轨道

首先需要创建一个自定义轨道的脚本,继承TrackAsset:

using UnityEngine;
using UnityEngine.Timeline;

[TrackClipType(typeof(LightControlAsset))]
[TrackBindingType(typeof(Light))]
public class LightControlTrack : TrackAsset {}

这段代码用了两个Attribute:

  • TrackClipType指定了轨道接收的PlayableAsset类型;
  • TrackBindingType指定了轨道要求绑定的对象类型。

现在还需要修改PlayableAsset和PlayableBehaviour,也就是之前的LightControlAsset和LightControlBehaviour。

LightControlBehaviour的代码如下:

using UnityEngine;
using UnityEngine.Playables;

public class LightControlBehaviour : PlayableBehaviour
{
   //public Light light = null; 不再需要它了
   public Color color = Color.white;
   public float intensity = 1f;

   public override void ProcessFrame(Playable playable, FrameData info, object playerData)
   {
       Light light = playerData as Light; // 这个地方有变化

       if (light != null)
       {
           light.color = color;
           light.intensity = intensity;
       }
   }
}

PlayableBehaviour中就不再需要Light成员变量了,因为可以从方法的playerData中获取到,转换成对应的类型即可。

using UnityEngine;
using UnityEngine.Playables;

public class LightControlAsset : PlayableAsset
{
   //public ExposedReference<Light> light; 不需要它了
   public Color color = Color.white;
   public float intensity = 1f;

   public override Playable CreatePlayable (PlayableGraph graph, GameObject owner)
   {
       var playable = ScriptPlayable<LightControlBehaviour>.Create(graph);

       var lightControlBehaviour = playable.GetBehaviour();
       //lightControlBehaviour.light = light.Resolve(graph.GetResolver());
       lightControlBehaviour.color = color;
       lightControlBehaviour.intensity = intensity;

       return playable;   
   }
}

PlayableAsset中也不需要再保留ExposedReference了,轨道会直接提供这个Light对象。

在Timeline中添加

现在就可以在Timeline中直接添加Light Control Track了。

添加Track后,需要设置绑定的对象。这样每个Clip都可以获取到这个绑定的对象。

就可以像内置的Track一样使用啦!

总结

自定义轨道可以支持你任意发挥,甚至可以让Timeline变成一个非线性运行,可交互的序列动画,是不是又勾起了你的兴趣?那就快来跟我小新一起来吧。

【扩展学习】对Timeline&Cinemachine感兴趣的童鞋:更多教程在洪流学堂公众号回复timeline获取,免费获取图文手册,更有视频教程。


好了,今天就就让小新絮絮叨叨到这里了。没讲清楚的地方欢迎评论,不点赞收藏我可能不会回复你的哦(¬、¬) (¬_¬)

我是大智,你的技术探路者,下次见!

别走!点赞收藏哦!

好,你可以走了。

发布了138 篇原创文章 · 获赞 72 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/zhenghongzhi6/article/details/104041067