Cinemachine教程 | Unity中如何快速製作鏡頭晃動?

摘要:經常在遊戲、影視中會看到鏡頭晃動的鏡頭,比如槍的後坐力、爆炸、碰撞、巨人踩踏地面等等,鏡頭晃動如何快速製作呢?

洪流學堂,讓你快人幾步。你好,我是跟着大智學Unity的萌新,我叫小新,這是我本週的學習總結報告哦。

今天小新要給你分享的問題是:

Unity中如何快速製作鏡頭晃動?

經常在遊戲、影視中會看到鏡頭晃動的鏡頭,比如槍的後坐力、爆炸、碰撞、巨人踩踏地面等等,鏡頭晃動如何快速製作呢?

要想解決這個問題,在Cinemachine中是非常簡單的,就是使用Impluse相關的功能。

Cinemachine Impulse 相機震動

Cinemachine Impulse可以根據遊戲事件產生和管理相機晃動。比如當兩個物體發生碰撞、附近發生爆炸時,可以讓虛擬相機發生劇烈晃動。

Impulse的本意是脈衝,小新感覺在這翻譯爲震動更合適。

Impulse由三個部分組成:

  • Raw vibration signal 原始震動信號。包含6個維度:X, Y, Z, pitch, roll, yaw的震動曲線。這個震動信號很大程度上決定了相機鏡頭晃動的表現形式。

  • Impulse Source 震動的發生源。定義了震動發生的位置、時長、強度和範圍。

  • Impulse Listener Cinemachine的擴展,添加了這個擴展後虛擬相機就能“感受到”震動,並且作出晃動的反應。

Impulse使用流程
1、給場景中的一個或多個物體添加Cinemachine Impulse Source(代碼觸發)或Cinemachine Collision Impulse Source(碰撞觸發)組件,這些物體會作爲震動源。

2、給震動源組件上設置震動信號Raw Signal,可以使用內置的Presets,也可以自定義創建。

3、給需要對震動作出反應的虛擬相機添加Cinemachine Impulse Listener組件。

添加Cinemachine Impulse Listener擴展組件

震動源組件

Cinemachine Impulse SourceCinemachine Collision Impulse Source組件都是震動源組件,有啥區別呢?

  • Cinemachine Collision Impulse Source 根據碰撞或觸發器產生震動信號。
  • Cinemachine Impulse Source 根據事件產生震動信號。

震動源可以根據代碼或碰撞觸發震動源產生震動信號。觸發震動源後,震動源(所在位置)產生震動信號,然後擁有Impulse Listener擴展的虛擬相機對震動做出反應產生晃動。

如下圖中,角色的腳是震動源。當腳與地板(A)發生碰撞時會產生震動。虛擬相機上的Impulse Listener擴展會對震動作出反應,那就是相機的晃動(B),會導致Game窗口中C的結果。

場景中可以根據需要設置多個震動源。下面是一些應用場景的舉例:

  • 巨人的腳上設置震動源。巨人走動時可以製造出大地晃動的感覺。
  • 在炮彈上設置震動源。炮彈命中目標後爆炸的效果。

默認情況下,一個震動源會影響所有範圍內的Impulse Listener,但是你可以通過設置channel filtering來進行篩選。

Impulse Source的核心屬性

原始震動信號定義了相機晃動的基本“形態”,Impulse Source組件中控制了一些其他重要的屬性,影響生成的震動。

理解下面這些屬性可以讓你做出更真實的相機晃動效果。

主要是下面這些屬性:

  • Amplitude 控制震動的振幅。
  • Orientation and direction 朝向和方向。震動可以改變信號的方向,保持震動方向的一致。
  • Time envelope 控制信號的起音,維持和衰減,以使信號淡入和淡出至適當的強度並具有一定的持續時間。
  • Spatial range 空間範圍控制信號在場景中完全消失之前在場景中傳播的距離。

Amplitude 振幅

組件Raw Signal屬性中的振幅控制每次震動的強度。有兩種方法可以調整給定震動信號的振幅。

Amplitude Gain屬性可以放大或衰減原始震動信號,它會一直影響所有震動。可以將其視爲用於調高或調低源震動強度的全局“音量”設置。

通過代碼生成信號時更改Velocity矢量的大小也會縮放信號振幅,但影響是單次的,不是全局的。通過調整單個震動事件的Velocity,可以讓輕度衝擊產生較小的振動,而重度衝擊產生較大的振動。

  • 對於Cinemachine Impulse Source組件,你必須自己通過腳本設置Velocity。信號的幅度按速度的大小縮放。代碼如下:
var source = GetComponent<CinemachineImpulseSource>();
source.GenerateImpulse(new Vector3(100, 100, 100));
  • 對於Cinemachine Collision Impulse Source組件自動根據三個屬性定義的規則來計算單次的Velocity:Use Impact Direction、Scale Impact With Mass、Scale Impact With Speed。

最終每次碰撞的實際振幅,就是全局參數(信號源,Amplitude Gain屬性)和單次調節參數(Velocity)相乘的結果。

Orientation and Direction 朝向和方向

爲了產生逼真的振動,震動信號沿衝擊軸應最強,其振幅(或強度)應與衝擊力成正比。例如,如果你用錘子敲擊牆壁,則牆壁主要沿錘子路徑的軸線振動。爲了使錘子的脈衝信號更真實,它在該軸上應具有最大的振動。

在下圖中,振動主軸(A)與錘子撞擊牆壁(B)時的行進方向一致。

Impulse不需要爲每個可能的衝擊方向和強度分別定義信號,而是使用“局部空間”的概念來定義原始信號。你可以在原始信號的本地空間中旋轉和縮放原始信號,以生成與實際影響相匹配的“最終”信號。

Impulse默認情況下撞擊的方向是“向下”,因此,一般你的信號應沿Y軸施加更多的振動(6D shake noise profile會這樣做)。你也可以通過局部空間的旋轉和縮放來爲每次撞擊產生正確的振動方向。

控制朝向和方向

Cinemachine Impulse SourceCinemachine Collision Impulse Source組件中的屬性可以控制原始信號的朝向。使用下面這些屬性來模擬現實世界的振動。

  • 對於Cinemachine Impulse Source組件,GenerateImpulse()方法將速度矢量作爲參數。該矢量定義了衝擊的方向和強度。Impulse系統使用它根據原始信號定義來計算最終信號,並對其進行適當的旋轉和縮放。

  • 對於Cinemachine Collision Impulse Source組件,會根據所涉及GameObject的方向和質量自動生成速度矢量。要控制生成結果,使用Inspector中的How To Generate The Impulse中的屬性。Use Impact Direction屬性控制信號是否被旋轉到對應衝擊方向。

方向模式

Spatial Range > Direction Mode屬性可以對信號方向進行微調。設置爲Rotate Towards Source時,脈衝信號會進一步旋轉,以使振動指向震動源的方向更加明顯。

對於徑向對稱振動,效果並不明顯,但是對於強調方向的信號(如6D震動),它可以暗示振動的來源。當你在多個位置產生影響並且不希望它們都感覺相同時,這可能會非常有效。

Direction Mode的默認設置是Fixed,不會產生特殊效果。

Time envelope 時間包絡

真實世界中,衝擊產生的振動會先增強強,直到達到峯值強度,然後減弱直到振動停止。這個週期需要多長時間取決於撞擊的強度以及所涉及物體的特徵。

例如,用錘子敲打混凝土牆會產生短暫而強烈的衝擊。振動幾乎立即達到其峯值強度,並且幾乎立即停止。另一方面,撞擊大片薄金屬會產生持續的振動,該振動突然開始,停留在峯值強度一段時間,然後逐漸軟化。

當場景中的碰撞晃動相機時,使用Impulse Source中的Time Envelope屬性控制此循環。Time Envelope具有三個屬性:

  • Attack控制脈衝信號向峯值強度的過渡。
  • Sustain Time指定信號在峯值強度處停留多長時間。
  • Decay控制信號從峯值強度到零的過渡。

AttackDecay中包含時長值(指定過渡持續多長時間)和一個曲線(可選,定義它如何發生,例如,是否逐漸地或突然發生)。如果在Inspector中將曲線留爲空白,則Impulse將使用默認曲線,適用於大多數用途。Sustain Time持續時間僅僅是一個持續時間值。

總而言之,這些屬性控制着撞擊產生的振動持續多長時間,以及它們如何淡入和淡出。但是,它們並不能改變震動強度。可以啓用Scale with Impact屬性。啓用後,時間範圍會根據影響的強度進行縮放。較強的影響會使持續時間更長,而較弱的影響會使持續時間更短。這不會影響三個階段的時長比例。

Spatial Range 空間範圍

Impulse Source的Spatial Range屬性定義了場景中震動源影響的區域。此區域中的Impulse Listener會對脈衝源做出反應(除非將它們過濾掉),而位於外部的Listener則不會作出反應。

該區域包括兩個屬性:Impact Radius衝擊半徑Dissipation Distance耗散距離。當脈衝源產生脈衝時,振動信號將保持全強度,直到到達衝擊半徑的末端。然後,其強度在耗散距離上衰減爲零。這兩個屬性共同定義了信號的總範圍。

在下圖中,從振動點發出到到達衝擊半徑(A)爲止,振動信號一直保持全強度,然後在耗散距離(B)處逐漸消失。

振動信號從其從撞擊點發出到到達撞擊半徑(A)一直保持全強度,然後在耗散距離(B)處逐漸消失。

Dissipation Mode耗散模式屬性控制信號在Dissipation Distance耗散距離上如何淡出。

  • Exponential Decay指數衰減會產生逐漸消失的**衰減,**隨着逐漸接近耗散距離的末尾,衰減會變慢。

  • Soft Decay軟衰減創建的淡出開始緩慢,加快並在接近耗散距離終點時再次減速。

  • Linear Decay線性衰減會在耗散距離上產生均勻的淡出。

擴展閱讀

【擴展學習】洪流學堂公衆號回覆timeline可以下載Timeline&Cinemachine系列教程全文帶目錄PDF哦,更有本文的視頻教程等着你!


呼~ 今天小新絮絮叨叨的真是夠夠的了。沒講清楚的地方歡迎評論,咱們一起探索。

我是大智(歡迎加我微信:zhz11235),你的技術探路者,下次見!

別走!點贊收藏哦!

好,你可以走了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章