本文转自 Unity Connect 博主 大智
用过一段时间 Timeline 后,我问大智:“Timeline 中只有这么几个轨道么?我发现有的需求这些轨道根本没办法满足,使用之前学过的 Playable Track 也很麻烦,还有其他办法么?”
用过一段时间 Timeline 后,我问大智:“Timeline 中只有这么几个轨道么?我发现有的需求这些轨道根本没办法满足,使用之前学过的 Playable Track 也很麻烦,还有其他办法么?” 大智:“你遇到了什么问题呢?” 小新:“之前咱们学的那个 Playable 轨道其中一个问题是:每次添加自定义 clip 时,都需要给它指定 Light 组件,如果 Clip 很多,会非常麻烦。” 大智:“这个还好,不算个大问题,多选就能一次搞定。不过你可能更需要的是自定义轨道。使用自定义轨道有几个好处:
可以发挥你的脑洞,用代码实现出无限的可能 可以解决轨道的绑定(如下图中的 Bound object )问题,只需要绑定一次,轨道上的所有 Clip 都可以访问。比如 Animation Track、Activation Track 都是这样的。 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;</light>
public override Playable CreatePlayable (PlayableGraph graph, GameObject owner) { var playable = ScriptPlayable<lightcontrolbehaviour>.Create(graph);</lightcontrolbehaviour>
var lightControlBehaviour = playable.GetBehaviour();
//lightControlBehaviour.light = light.Resolve(graph.GetResolver());
lightControlBehaviour.color = color;
lightControlBehaviour.intensity = intensity;
return playable;
} } PlayableAsset 中也不需要再保留 ExposedReference<light>了,轨道会直接提供这个 Light 对象。 在 Timeline 中添加 现在就可以在 Timeline 中直接添加 Light Control Track 了。</light>
添加 Track 后,需要设置绑定的对象。这样每个 Clip 都可以获取到这个绑定的对象。 就可以像内置的 Track 一样使用啦! 总结 自定义轨道可以支持你任意发挥,甚至可以让 Timeline 变成一个非线性运行,可交互的序列动画,是不是又勾起了你的兴趣?那就快来跟我小新一起来吧。 [扩展学习] 对 Timeline&Cinemachine 感兴趣的童鞋:更多教程在洪流学堂公众号回复 timeline 获取,免费获取图文手册,更有视频教程。
原文链接: https://connect.unity.com/p/ru-he-zai-timelinezhong-chuang-jian-zi-ding-yi-gui-dao?app=true 更多 Unity 精彩内容,请戳上方链接,下载 Unity 官方 app,在线讨论,技术答疑,干货满满!