前言
在使用Timeline自訂腳本的時候,有需要繼承幾個類別,一開始接觸的時候還蠻混亂的,之後稍微清楚了所以紀錄一下。
最常用到的幾個類別分別為:
以一個Timeline編輯器來說,最主要就分為
- 編輯器本身
- 軌道
- 軌道上的片段
對照圖就會是
Playable
Timeline是基於Playable API去實現的,創建Timeline的時候
也可以看到副檔名是.playable,也就是說除了Timeline外,還可以使用這組API去完成各種事情。
有興趣的話可以參考 UnityTaiwan的範例。
TrackAsset
1 | [TrackColor(241f/255f,249f/255f,99f/255f)] |
在這邊我想完成的是在Track綁定一個Sprite,用Clip控制這個圖片在那些時間點移動,因為程式碼有點量,只節錄一些一般會用到的片段。
第1行 是宣告這個Track的顏色
第2行TrackClipType宣告了這個Track綁的Clip,通常會是擴充功能中繼承了PlayableAsset的類別,放進編輯器的話畫面是下方紅圈那樣
第3行則是這一個Track綁的物件,這邊綁的是隨便一個遊戲物體,在編輯器上位於最前方,見下方藍圈。
PlayableAsset與PlayableBehaviour
這兩個會放在一起的原因是,Playable API的核心原則是分離數據與邏輯,這兩個分別代表了一個Clip中的數據與邏輯。
PlayableAsset是數據部分而PlayableBehaviour則是處理邏輯
- PlayableAsset
1
2
3
4
5
6
7
8
9
10
11
12public class ImageControlAsset : PlayableAsset, ITimelineClipAsset
{
[SerializeField]
private ImageControlBehaviour template = new ImageControlBehaviour();
public ClipCaps clipCaps { get{ return ClipCaps.None; }}
public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
{
return ScriptPlayable<ImageControlBehaviour>.Create(graph, template);
}
}
可以看到在這個處理數據的類別包含了邏輯的部分,在CreatePlayable的API那創建。
值得一提的是,這邊可以使用UnityEngine的東西,像是DestroyImmediate(obj) 在邏輯那個類則不行。
- PlayableBehaviour
1
2
3
4
5
6
7
8public class ImageControlBehaviour : PlayableBehaviour {
public override void ProcessFrame(Playable playable, FrameData info, object playerData)
{
Sprite data = (Sprite)playerData;
base.ProcessFrame(playable, info, playerData);
}
}
繼承PlayableBehaviour的類別可以使用很多類似於MonoBehaviour的API
但僅僅只是類似而已,還是有許多差別的,這些稍微介紹一下
ProcessFrame這個東西跟Update很相像,是在Timeline這個片段的時候會進行更新
而一開始在ImageControlTrack宣告的綁定物件類別 - Sprite
1 | [TrackBindingType(typeof(Sprite))] |
則可以從這個API內的第三個參數,傳入類行為object內找到,將他轉型就可以拿到你放入的物件,再對它進行處理。
另外還可以用很多API,像是有OnBehaviourPlay、OnBehaviourPause、OnGraphStart、OnGraphStop這邊就不多介紹了。
1 | public class ImageControlBehaviour : PlayableBehaviour { |