Timeline 擴展功能類別之間的關係

前言

在使用Timeline自訂腳本的時候,有需要繼承幾個類別,一開始接觸的時候還蠻混亂的,之後稍微清楚了所以紀錄一下。
最常用到的幾個類別分別為:

  • Playable
  • TrackAsset
  • PlayableAsset
  • PlayableBehaviour 因為他們名字太相像,使用有些API也蠻像的,所以很容易搞不清楚它們分別是拿來幹嘛的。

以一個Timeline編輯器來說,最主要就分為

  1. 編輯器本身
  2. 軌道
  3. 軌道上的片段

對照圖就會是

Playable

Timeline是基於Playable API去實現的,創建Timeline的時候
也可以看到副檔名是.playable,也就是說除了Timeline外,還可以使用這組API去完成各種事情。
有興趣的話可以參考 UnityTaiwan的範例。

Simple Animation組件介紹

UNITY3D Playables API 实践(上)

TrackAsset

1
2
3
4
5
6
7
8
9
10
[TrackColor(241f/255f,249f/255f,99f/255f)]
[TrackBindingType(typeof(Sprite))]
[TrackClipType(typeof(ImageControlAsset))]
public class ImageControlTrack : TrackAsset {

protected override Playable CreatePlayable(PlayableGraph graph, GameObject go, TimelineClip clip)
{
return base.CreatePlayable(graph, go, clip);
}
}

在這邊我想完成的是在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
    12
    public 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
    8
    public 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class ImageControlBehaviour : PlayableBehaviour {

public override void ProcessFrame(Playable playable, FrameData info, object playerData)
{
Sprite data = (Sprite)playerData;
base.ProcessFrame(playable, info, playerData);
}

public override void OnBehaviourPlay(Playable playable, FrameData info)
{
base.OnBehaviourPlay(playable, info);
}

public override void OnBehaviourPause(Playable playable, FrameData info)
{
base.OnBehaviourPause(playable, info);
}

public override void OnPlayableCreate(Playable playable)
{
base.OnPlayableCreate(playable);
}

public override void OnGraphStart(Playable playable)
{
base.OnGraphStart(playable);
}

public override void OnGraphStop(Playable playable)
{
base.OnGraphStop(playable);
}
}