如何在Timeline中創建自定義軌道?

你好,我是跟着大智學Unity的萌新,我叫小新,這是我本週的學習總結報告哦。

用過一段時間Timeline後,我問大智:“Timeline中只有這麼幾個軌道麼?我發現有的需求這些軌道根本沒辦法滿足,使用之前學過的Playable Track也很麻煩,還有其他辦法麼?”

大智:“你遇到了什麼問題呢?”

小新:“之前咱們學的那個Playable軌道其中一個問題是:每次添加自定義clip時,都需要給它指定Light組件,如果Clip很多,會非常麻煩。”

大智:“這個還好,不算個大問題,多選就能一次搞定。不過你可能更需要的是自定義軌道。使用自定義軌道有幾個好處:”
1、可以發揮你的腦洞,用代碼實現出無限的可能
2、可以解決軌道的綁定(如下圖中的Bound object)問題,只需要綁定一次,軌道上的所有Clip都可以訪問。比如Animation Track、Activation Track都是這樣的。
3、Playable Track上如果混用很多類型的Clip時,最後會很混亂,也不直觀。自定義軌道可以直觀地將不同用途的軌道區分開。

軌道的結構圖

那我們來看看如何把之前學習Playable軌道時的自定義Light Clip改成自定義軌道,然後綁定Light組件。

注意下面是基於之前的Playable軌道這一節學習的,如果還沒學習,建議先去學習Playable軌道

自定義軌道

首先需要創建一個自定義軌道的腳本,繼承TrackAsset:

using UnityEngine;
using UnityEngine.Timeline;

[TrackClipType(typeof(LightControlAsset))]
[TrackBindingType(typeof(Light))]
public class LightControlTrack : TrackAsset {}

這段代碼用了兩個Attribute:

  • TrackClipType指定了軌道接收的PlayableAsset類型;
  • TrackBindingType指定了軌道要求綁定的對象類型。

現在還需要修改PlayableAsset和PlayableBehaviour,也就是之前的LightControlAsset和LightControlBehaviour。

LightControlBehaviour的代碼如下:

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)
   {
       Light light = playerData as Light; // 這個地方有變化

       if (light != null)
       {
           light.color = color;
           light.intensity = intensity;
       }
   }
}

PlayableBehaviour中就不再需要Light成員變量了,因爲可以從方法的playerData中獲取到,轉換成對應的類型即可。

using UnityEngine;
using UnityEngine.Playables;

public class LightControlAsset : PlayableAsset
{
   //public ExposedReference<Light> light; 不需要它了
   public Color color = Color.white;
   public float intensity = 1f;

   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;   
   }
}

PlayableAsset中也不需要再保留ExposedReference了,軌道會直接提供這個Light對象。

在Timeline中添加

現在就可以在Timeline中直接添加Light Control Track了。

添加Track後,需要設置綁定的對象。這樣每個Clip都可以獲取到這個綁定的對象。

就可以像內置的Track一樣使用啦!

總結

自定義軌道可以支持你任意發揮,甚至可以讓Timeline變成一個非線性運行,可交互的序列動畫,是不是又勾起了你的興趣?那就快來跟我小新一起來吧。

【擴展學習】洪流學堂公衆號回覆timeline可以下載Timeline&Cinemachine系列教程全文帶目錄PDF


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

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

別走!點贊收藏哦!

好,你可以走了。

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