一.轨道基本要素
- 轨道(Track):如下图1所示。
- 片段(Clip):如下图2所示。
- 行为(Behavior):与片段绑定,决定片段在轨道上的播放、暂停等行为。
- 混合器(Mixer):决定片段与片段如何融合。(该示例为简单版,未定义Mixer)
二.自定义简单的灯光轨道
1.定义轨道(Track)脚本
- 脚本继承自
TrackAsset
。 TrackColor()
特性:轨道颜色TrackClipType()
特性:轨道内可播放的片段类型TrackBindingType()
特性:轨道绑定的物体(该物体上包含可播放片段类型的组件)- 说明:在该示例中,灯光物体没有绑定到轨道上,而是绑定在片段上,故没有使用特性
TrackBindingType()
。这样,在一条轨道中,不仅能控制一个灯光的变化,还可以控制多个灯光物体的变化。
using UnityEngine.Timeline;
[TrackColor(238/255f,180/255f,180/255f)]
[TrackClipType(typeof(PracticeLightClip))]
//[TrackBindingType(typeof(PracticeLightClip))]
public class PracticeLightTrack : TrackAsset
{
}
2.定义片段(Clip)脚本
- 脚本继承自
PlayableAsset
。 ExposedReference<T>
:将T类型的实例引用暴露出来的一个泛型类型,以便于在Inspector
面板中直接拖拽赋值。CreatePlayable()
:该脚本必须实现的方法,必须在该方法内创建片段并返回。- 更多要点见代码注释部分。
using UnityEngine;
using UnityEngine.Playables;
public class PracticeLightClip : PlayableAsset
{
public ExposedReference<Light> lightObject;
public Color lightColor = Color.white ;
public float intensity = 1f;
public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
{
//创建片段固定格式
var playableAsset = ScriptPlayable<PracticeLightBehavior>.Create(graph);
//获取片段绑定的Behavior实例
var playableBeahavior = playableAsset.GetBehaviour();
//从暴露引用的类型ExposedReference<Light>中获取Light类型固定格式
playableBeahavior.lightObject = lightObject.Resolve(graph.GetResolver());
playableBeahavior.color = lightColor;
playableBeahavior.intensity = intensity;
return playableAsset;
}
}
3.定义行为(Behavior)脚本
- 脚本继承自
PlayableBehaviour
。 ProcessFrame()
:当前片段上每帧执行的方法。为PlayableBehaviour
生命周期函数之一。- 常用
PlayableBehaviour
生命周期函数见下表:
函数名 | 官方解释 |
---|---|
OnPlayableCreate | 拥有 PlayableBehaviour 的 Playable 创建后调用此函数。 |
ProcessFrame | 在 PlayableGraph 的 PrepareFrame 阶段调用此函数。 |
更多函数见官方文档 | https://docs.unity3d.com/cn/2021.1/ScriptReference/Playables.PlayableBehaviour.html |
using UnityEngine;
using UnityEngine.Playables;
public class PracticeLightBehavior : PlayableBehaviour
{
public Light lightObject;
public Color color;
public float intensity;
public override void ProcessFrame(Playable playable, FrameData info, object playerData)
{
lightObject.color = color;
lightObject.intensity = intensity;
}
}
三.补充
- TimeLine轨道的基本要素中,
Clip
一般承载片段的数据部分,Behavior
和Mixer
一般承载片段的逻辑部分。 - 在完整的自定义轨道中,有时为了方便
Behavior
调用Clip
中的数据(字段),会将数据部分(字段)也定义在Behavior
部分中,这便引出了另一种创建片段的方式。
1.定义片段(Clip)脚本(另一种方式)
关键点已用注释标注。
using UnityEngine;
using UnityEngine.Playables;
public class PracticeLightClip : PlayableAsset
{
public PracticeLightBehavior lightBehavior = new PracticeLightBehavior(); //( •̀ ω •́ )✧
public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
{
var playableAsset = ScriptPlayable<PracticeLightBehavior>.Create(graph, lightBehavior); //( •̀ ω •́ )✧
return playableAsset;
}
}
2.定义行为(Behavior)脚本(另一种方式)
关键点已用注释标注。
using UnityEngine;
using UnityEngine.Playables;
[System.Serializable] //( •̀ ω •́ )✧
public class PracticeLightBehavior : PlayableBehaviour
{
public ExposedReference<Light> lightObject; //( •̀ ω •́ )✧
private Light light;
public Color color = Color.white;
public float intensity = 1f;
public override void ProcessFrame(Playable playable, FrameData info, object playerData)
{
var graph = playable.GetGraph();
light = lightObject.Resolve(graph.GetResolver());
light.color = color;
light.intensity = intensity;
}
}
四.效果
五.参考及推荐资料
- B站Up BeaverJoe TimeLine 自定义对话轨道
https://www.bilibili.com/video/BV11K4y1f7P4?share_source(复制地址后手动打开) - B站Up BeaverJoe TimeLine 直播讲解
- TimeLine自定义轨道(文章)
- 插件:Default Playables 提供了更多的轨道