你好,我是跟着大智學Unity的萌新,我叫小新,這是我本週的學習總結報告哦。
大智:“小新,學習Playable Track之前你瞭解它麼?”
小新:“還真不瞭解,我嘗試過,但是添加以後一片空白,啥都沒有,就不知道該怎麼用了。”
大智:“那估計有很多同學也遇到過這種情況,你今天就帶着大家一起探索下吧。”
小新:“好嘞。”
Playable Track
在Timeline創建Track的菜單裏有一個Playable Track,它是個什麼軌道呢?
如果你不小心(特意)創建出來過Playable Track,你會一頭霧水,因爲好像不能往裏面添加任何Clip。這是因爲這個軌道里面放置的是自定義Clip,需要通過代碼來實現。下面咱們一起看下這個代碼怎麼寫。
自定義Playable Clip
下面通過一個小栗子來闡述。現在咱們定個小目標:通過自定義Clip修改燈光的顏色和亮度(當然了,這個功能可以通過Animation Track實現,但是我偏不用)。我們是爲了學習自定義Clip,所以用自定義Clip來實現。
創建自定義clip需要二個腳本:
- 一個用於處理邏輯:需要繼承PlayableBehaviour
- 一個用於存放數據:需要繼承PlayableAsset
下面會用到Playable API,Playable API的核心原則是分離邏輯和數據。對Playable不瞭解的同學,可以讀一下之前的:【Playable API】不用Animator如何播放動畫?
處理邏輯
我們先創建一個腳本繼承PlayableBehaviour,在這個腳本里編寫處理的邏輯。處理的邏輯是啥呢?實際上就是隨着Timeline的時間變化,這個clip會如何變化。代碼如下:
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)
{
if (light != null)
{
light.color = color;
light.intensity = intensity;
}
}
}
這個代碼有啥作用呢?首先它確定需要修改Light組件的哪些屬性。
然後重寫了PlayableBehaviour的ProcessFrame方法。ProcessFrame會在Timeline每幀更新的時候調用。在這個方法中,你可以修改Light組件的屬性。
處理數據
接下來爲自定義clip創建PlayableAsset,用來保存數據,代碼如下:
using UnityEngine;
using UnityEngine.Playables;
public class LightControlAsset : PlayableAsset
{
public ExposedReference<Light> light;
public Color color = Color.white;
public float intensity = 1.0f;
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;
}
}
你會發現Playable API爲了實現數據和邏輯的分離,稍微有些麻煩,代碼量還是比較大的。
PlayableAsset有兩個目的。
- 首先它包含clip的數據,這些數據會在Timeline資源中序列化。
- 其次它創建PlayableBehaviour並給它賦值,最後輸出一個Playable圖。(PlayableGraph,這你可能對Playable圖不瞭解,沒關係,先略過它。)
CreatePlayable
方法中第一行代碼如下:
var playable = ScriptPlayable<LightControlBehaviour>.Create(graph);
這行代碼會爲graph添加自定義行爲LightControlBehaviour,這樣就可以在PlayableBehaviour設置Light的屬性。
LightControlAsset類的成員屬性中ExposedReference的作用是什麼呢?因爲PlayableAsset是個資源,它不能直接引用場景中的對象。此時ExposedReference會講Light作爲一個屬性暴露出來,可以在Timeline中設置它,然後在CreatePlayable中可以使用該對象。
使用Playable Track並且添加自定義Clip
現在就可以在Timline中添加Playable Track,然後右鍵點擊該新軌道添加自定義clip,菜單中會顯示剛纔添加的自定義Clip。
Add From Light
可以從場景中選擇一個Light添加Add Light Control Asset
可以直接添加一個clip,然後選中clip後,將Light組件指定給clip,就可以預覽結果了。
總結
內置Playable Track是個接收自定義Clip的通用軌道,它能接收簡單的自定義Playable clip,例如上面的那個例子。對於較複雜的情況,還可以使用自定義軌道。
【擴展學習】在洪流學堂公衆號回覆
timeline
可以下載Timeline&Cinemachine系列教程全文帶目錄PDF哦
好了,今天就絮絮叨叨到這裏了。沒講清楚的地方歡迎評論,不點贊、收藏我是不會回覆你的哦(¬、¬) (¬_¬)
我是大智,你的技術探路者,下次見!
別走!點贊,收藏哦!
好,你可以走了。