1. 程式人生 > >Unity - Cinemachine實現相機抖動

Unity - Cinemachine實現相機抖動

普通相機抖動指令碼較易實現,但在使用cinemachine相機下,其Transform元件不可被程式碼修改,那麼Cinemachine的相機抖動如何實現呢?本文結合實際專案,對實現相機抖動的三大步驟進行系統講解:

  • 專案地址:Hero - SouthBegonia

配置流程

專案背景:一款2D畫素動作遊戲,我們操控著Player(必須帶有Collider元件),遊戲相機為Cinemachine 2DCamera(關於其配置方法此處不做贅述,推薦文章在末尾參考處)

1. 在相機上新增監聽指令碼

在我們使用的虛擬相機 CM vcam1 上新增元件:AddComponent->CinemachineImpulse Listener

  • CinemachineImpulse Listener:監聽指令碼內震動訊號(方法呼叫),使得抖動在此相機上發生
    • Channel Mask:通道遮罩,此處最好預設為EveryThing
    • Gain:可獲得震動訊號的數目,0為遮蔽,1表示某時段僅能進行一個抖動運動
    • Use 2D Distance:用於2D遊戲,忽略相機Z軸的抖動

2. 在震動訊號發生物體上新增指令碼

震動訊號發生物體(呼叫震動函式的物體)為Player,因此需要在Player上新增元件:AddComponent->Cinemachine Collision Impulse Source(注:必須掛到含Collider的物體上),然後在Raw Signal右側齒輪->New Noise Settings 新增震動配置器,預設名CM vcam1 Raw Signal

  • Cinemachine Collision Impulse Source:含有抖動函式、震動配置器的關鍵指令碼
    • Raw Signal:震動配置器,配置震動引數的關鍵部件,我們開啟剛上面新建的CM vcam1 Raw Signal,可看到震動方式的各類引數。我們以Position Y,即上下抖動為例,新增Components後可設定其Frequency震頻及Amplitude震幅,並且勾選右側方框可將其設定為正弦波
    • Attack:抖動開始的變化曲線及時間
    • Sustain Time:抖動的持續時間
    • Decay:抖動衰退的變化曲線及時間

3. 呼叫震動方法:

在Player內引用震動核心指令碼,並在合適位置呼叫震動方法

private Cinemachine.CinemachineCollisionImpulseSource MyInpulse;

private void Start()
{
    MyInpulse = GetComponent<Cinemachine.CinemachineCollisionImpulseSource>();
}

private void Update()
{
    //按下右鍵產生相機抖動,抖動方式依照上面CM vcam1 Raw Signal內配置資訊
    if (Input.GetMouseButtonDown(1))
        MyInpulse.GenerateImpulse();       
}

至此,我們在遊戲內操控Player,按下右鍵即可實現相機抖動。當然除了上面無參的GenerateImpulse()方法,還有兩個帶參的方法:

//假若使用傳遞velocity的方法,其震動方式為velocity和CM vcam1 Raw Signal的混合
public void GenerateImpulse(Vector3 velocity);
public void GenerateImpulse(Vector3 position, Vector3 velocity);

此外,還有可能出現bug:還尚未呼叫震動函式,遊戲開始時就自動產生抖動。其產生原因博主尚未在對應指令碼內發現,但解決方式為關閉Player上的Cinemachine Collision Impulse Source指令碼

總述

Cinemachine中實現相機抖動的基本流程:

  • 在虛擬相機上新增監聽指令碼 CinemachineImpulse Listener
  • 在Player上新增震動核心指令碼Cinemachine Collision Impulse Source,並新增、設定震動配置器
  • Player指令碼合適位置呼叫震動函式

本例僅介紹了單Position方向上的抖動,讀者可按需配置抖動的Position、Rotation、發生時間、維持時間、衰退時間等,實現自己想要的效果

參考

  • Unity Cinemachine外掛全功能詳解 - Abukuma~
  • Cinemachine在2D遊戲中的開發小技巧 - Unity