1. 程式人生 > >Cinemachine&Timeline實踐

Cinemachine&Timeline實踐

使用前:

  • Cinemachine 為Unity 2017新功能,2018使用時在新建專案時選擇匯入對應的包,直接在商店裡匯入資源包可能會報編譯錯誤
  • Timeline 直接整合在編輯器中,可以在Project中直接建立Timeline,放入場景中

Timeline

Timeline可以建立不同的Track,實現對應型別資源的管理,包括:

  • Track Group
    同一遊戲物件的Timeline的各個Track可以集中在同一個Group內管理
  • Activation Track 
    控制遊戲物件的顯示與隱藏
  • Animation Track 
    動畫軌道,可以新增指定的AnimationClip,或者遊戲物件的Transform屬性的關鍵幀生成動畫,同時可以新增Override Track將不同型別的動畫(如 AniamtionClip和Transform屬性關鍵幀等)進行融合
  • Audio Track 
    聲音軌道
  • Control Track 
    主要控制與時間有關的元素,如粒子效果、Timeline等
  • Playable Track 
    新增自定義播放控制指令碼
  • Cinemachine_Timeline 
    新增Cinemachine片段

同一Track的不同片段之間可以融合,進行插值過渡

Timeline資源可以自定義觸發播放

    playableDirector.Play();
    //TimelineAsset 為 PlayableDirector型別   

Cinemachine

  • Dolly Camera with track 
    建立一個虛擬相機和軌道,軌道中可以新增點位,通過設定虛擬相機的Body屬性中PathPosition的值(0-index)控制相機隨軌道移動

     
    一般配合Timeline使用,實現相機的推拉,新增Animation Track指定對應的虛擬相機(with track),改變PathPosition的值,同時將虛擬相機新增到Cinemachine Track中,配合完成相機沿軌道運動。

  • Playable Track 
    Playable Track可以自定義相關動畫效果,在Default Playables資源包中包含了一部分自定義的功能軌道,包括文字、時間、燈光、位置、尋路、淡入淡出等效果,使用者也可以根據自己的需要進行定製化開發,以實現更加複雜的效果。 
    自定義指令碼繼承自 PlayableBehaviour 類,使用者通過重寫對應方法實現自定義效果:

    public class PlayableBehaviour : ScriptableObject, IPlayableAsset, IPlayableBehaviour
    {
    public BasicPlayableBehaviour();
    
    public virtual double duration { get; }
    public virtual IEnumerable<PlayableBinding> outputs { get; }
    
    public virtual Playable CreatePlayable(PlayableGraph graph, GameObject owner);
    public virtual void OnBehaviourPause(Playable playable, FrameData info);
    public virtual void OnBehaviourPlay(Playable playable, FrameData info);
    public virtual void OnGraphStart(Playable playable);
    public virtual void OnGraphStop(Playable playable);
    public virtual void OnPlayableCreate(Playable playable);
    public virtual void OnPlayableDestroy(Playable playable);
    public virtual void PrepareFrame(Playable playable, FrameData info);
    public virtual void ProcessFrame(Playable playable, FrameData info, object playerData);
    }
    

例如控制播放的速度:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

public class PlayableTime : BasicPlayableBehaviour {
//動畫曲線,通過曲線控制取值
public AnimationCurve mCurve;
//已播放時間
private float havePlayedTime;
//曲線總間隔時間
private float allTime;

//當playable停止播放時,將Game的時間播放速度重置為1
public override void OnGraphStop(Playable playable)
{
    Time.timeScale = 1;
}

//當playable播放時,獲得該片段的完整時長
public override void OnBehaviourPlay(Playable playable, FrameData info)
{
    allTime = (float)PlayableExtensions.GetDuration(playable);
}

//在playable播放時的每一幀,獲取累計已播放時間,除以總間隔,
//對應到曲線的x軸,從曲線上取得對應播放速度值
public override void PrepareFrame(Playable playable, FrameData info)
{
    havePlayedTime += info.deltaTime;
    Time.timeScale = mCurve.Evaluate(havePlayedTime/allTime);
}
}  

有個小問題,在Unity2018.2.3f1中使用Playable Track建立自定義效果時,如果繼承自 PlayableBehaviour ,Playable Track將不能識別該指令碼,只好使用過時的 BasicPlayableBehaviour 不影響使用。

最終實現效果:

相關參考: