你好,我是跟着大智学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
可以下载Timeline&Cinemachine系列教程全文带目录PDF哦
好了,今天就就让小新絮絮叨叨到这里了。没讲清楚的地方欢迎评论,不点赞、收藏我可能不会回复你的哦(¬、¬) (¬_¬)
我是大智,你的技术探路者,下次见!
别走!点赞,收藏哦!
好,你可以走了。