揭開Timeline中Playable Track的神祕面紗

你好,我是跟着大智學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


好了,今天就絮絮叨叨到這裏了。沒講清楚的地方歡迎評論,不點贊收藏我是不會回覆你的哦(¬、¬) (¬_¬)

我是大智,你的技術探路者,下次見!

別走!點贊收藏哦!

好,你可以走了。

發佈了142 篇原創文章 · 獲贊 77 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章