簡介
在遊戲中,攝像頭的效果是很是重要的,將會直接影響到呈如今玩家眼中的畫面,好的效果能夠直接提升玩家的遊戲體驗,給予一種身臨其境的感受。例如在一個FPS遊戲中,咱們每每須要攝像頭跟隨咱們的角色,作一些第一人稱第三人稱的切換,當角色進入室內時須要調整攝像頭位置來防止被牆擋住,在使用倍鏡時須要攝像頭觀察遠處的畫面等等。覺得要實現這些效果咱們須要編寫不少的控制代碼來控制咱們的Camera,然而再有了Cinemachine以後,一切都會變得簡單起來。html
Cinemachine是Unity在2017版本推出的一套處理Camera的組件,利用Cinemachine咱們能夠不經過敲代碼就實現不少攝像機功能。例如上面提到的那些需求,Cinemachine均可以幫咱們快速的實現,此外咱們還能夠利用Cinemachine加上Timeline,作一些過場動畫等效果。ide
官方文檔:https://docs.unity3d.com/Packages/com.unity.cinemachine@2.6/manual/index.html工具
咱們能夠經過Package Manager來安裝Cinemachine(以下左圖),安裝好後,在咱們的Unity工具欄就會多出一項Cinemachine的選項供咱們使用(以下右圖)。性能
注:文章中使用的是Cinemachine2.6的版本,須要Unity版本爲2018.4.17f1或者更新。測試
簡單使用
安裝好Cinemachine後,咱們來看看點擊Cinemachine菜單下的 Create Virtual Camera 以後會發生什麼,能夠發現咱們場景中多了一個名爲 CM vcam1 的GameObject,掛載着 CinemachineVirtualCamera 組件(以下左圖,後續稱爲VirtualCamera)。同時咱們的Main Camera身上也多了一個 CinemachineBrain 組件(以下右圖),這兩個組件就是咱們Cinemachine的核心了。動畫
接着咱們在場景中新建一個Cube,將這個Cube拖到VirtualCamera的Follow和Look At的設置當中。此時就會發現,咱們的Main Camera看向了咱們的Cube,而且當咱們移動Cube的時候,Camera也會跟着一塊兒移動。ui
沒有寫一行代碼,就實現了最簡單的Camera跟隨物體的功能了!spa
Blend
接着,咱們建立第二個VirtualCamera(CM vcam2),此時畫面會變爲新的VirtualCamera看見的畫面。咱們調整該VirtualCamera的座標和旋轉,從另個角度看向Cube,例以下圖。3d
而後咱們隱藏該VirtualCamera,會從新顯示CM vcam1的畫面,而後運行Unity。運行後,咱們再將CM vcam2設爲active狀態,此時能夠發現,咱們的畫面會從CM vcam1切換到CM vcam2,例以下圖:code
這個過程咱們稱之爲Blend,沒有代碼就實現了鏡頭切換(混合)的效果。
CinemachineVirtualCamera
CinemachineVirtualCamera是Cinemachine的核心組件之一,前面咱們利用了其Follow和Look At就簡單的實現了Camera的跟隨和看向物體的功能,接下來咱們來詳細的看看它各個設置的做用。
Base
先來看看以下圖這些基礎設置的含義
Status
在任什麼時候間,咱們的VirtualCamera都處於下面三種狀態中的一種:
Live | 當前控制着Camera(帶有CinemachineBrain組件)的VirtualCamera,即處於Live狀態。當一個VirtualCamera混合到另外一個時,該過程當中,兩個VirtualCamera都處於Live狀態,當混合結束或者其餘狀況下,同一時刻內只會存在一個Live狀態下的VirtualCamera。 |
Standby | 沒有控制着Camera的VirtualCamera,即處於Standby狀態。該狀態下的VirtualCamera仍是會一直跟隨和看向設置的目標,而且每幀都會更新。該狀態下的VirtualCamera屬於激活狀態(active與enable等於true),而且其 priority 的值小於或等於Live狀態的VirtualCamera。 注:2.6.3新增StandbyUpdate設置,能夠設置更新頻率(詳情見下) |
Disabled | 當VirtualCamera屬於未激活狀態(active或enable等於false),即處於Disable狀態。該狀態下沒有任何的性能消耗,即不會控制Camera,不會跟隨目標,不會每幀更新等。不過若是該VirtualCamera參與混合或者被Timeline調用,那麼依舊能夠控制Camera |
Solo按鈕:選中該按鈕,能夠將當前的VirtualCamera臨時的設置爲Live狀態,幫助咱們查看對應的鏡頭效果。
Game Window Guides
開啓後,會在Game視圖中顯示一些輔助線(以下圖)。這些輔助線會在VirtualCamera看向(Look At)一個指定的GameObject而且Aim設置爲Composer或Group Composer或者跟隨(Follow)一個指定的目標而且Body設置爲Framing Transposer時出現。
注:該設置應用於全部的VirtualCamera,例如咱們在其中一個VirtualCamera開啓或關閉該功能,那麼全部的VirtualCamera的該項設置都會開啓或關閉。
Save During Play
開啓後,能夠在運行狀態下直接保存咱們對VirtualCamera設置的修改,而不須要咱們經過複製粘貼的方式來記住這些修改了的屬性。
注:和Game Window Guides同樣,是一個應用於全部VirtualCamera的設置。
Priority
權重,值越大說明優先權越高。例如:一個非Live狀態的VirtualCamera,當其Priority值大於等於當前Live狀態下VirtualCamera而且本身屬於激活狀態,那麼CinemachineBrain會選擇它做爲新的Live狀態的VirtualCamera。
注:使用Timeline處理VirtualCamera時,該屬性不起做用
Follow
跟隨目標,即VirtualCamera會跟着設置的目標移動而移動。會根據Live狀態的VirtualCamera所設置的目標結合Body中的設置來更新Camera的Position。若不設置目標,Camera的Position就會與VirtualCamera同步。例如咱們能夠用Timeline來給VirtualCamera添加動畫,而後Camera也會產生相同效果。
Look At
看向目標,即Camera看向的目標(Transform.LookAt)。會根據Live狀態的VirtualCamera所設置的目標結合Aim中的設置來更新Camera的Rotation。若不設置目標,Camera的Rotation就會與VirtualCamera同步。
Standby Update
設置處於Standby狀態的VirtualCamera的更新頻率(2.6.3新增),有以下三個選項
Always | 每幀更新 |
Never | 不更新 |
Round Robin | 偶爾更新,具體更新頻率取決於Standby狀態的VirtualCamera數量 |
Lens
以下三個設置和Camera中的相同設置所對應,Camera中的值會跟此同步。例如一個帶有CinemachineBrain的Camera,當它對應的Live狀態的VirtualCamera的FOV值改成77,那麼Camera中的FOV值也會相應的變爲77。
Field Of View | FOV,控制Camera的視窗大小 |
Near Clip Plane | Camera最近能看見的距離 |
Far Clip Plane | Camera最遠能看見的距離 |
Presets:在Field Of View右側有個小的下拉框,點擊Edit Presets能夠新建或修改用作預設的Asset文件。Lens Presets Asset文件內容以下:
Presets能夠幫助咱們快速的設置FOV等屬性。
Dutch:用於修改Camera中Rotating的z軸值,取值範圍 -180~180 。
Transitions
2.6.3新增
BlendHint
從最開始的例子中能夠看見,當一個VirtualCamera混合到另外一個VirtualCamera的過程當中,Camera會有一個行徑的路線,而且伴隨着Camera的旋轉。該設置能夠選擇混合到該VirtualCamera或從該VirtualCamera混合到別的時的路線方式。
None | 座標和朝向以一種標準的線性混合 |
SphericalPosition | 若是兩個VirtualCamera有共同的LookAt目標,那麼座標的行徑路線會像在圓的面上同樣。 |
CylindricalPosition | 若是兩個VirtualCamera有共同的LookAt目標,那麼座標的行徑路線會像在圓柱的面上同樣。 |
ScreenSpaceAimWhenTargetsDiffer | Standard linear position blend, radial blend between LookAt targets |
Inherit Position:開啓時,當VirtualCamera狀態變爲Live時,則會繼承上一個Live狀態的VirtualCamera的Position信息。
On Camera Live:回調
Body
Body的設置主要用於指定VirtualCamera的移動規則,主要有以下七大類:
Do nothing | 不移動VirtualCamera |
3rd Person Follow | 適用於第三人稱或第一人稱的跟隨效果 |
Framing Transposer | 根據Follow設置的目標,以固定的屏幕空間關係移動 |
Hard Lock To Target | 根據Follow設置的目標,以固定的關係移動 |
Orbital Transposer | 根據Follow設置的目標,以可變的關係移動,例如能夠選擇接收玩家的輸入 |
Tracked Dolly | 沿着預先設置的路徑移動 |
Transposer | 根據Follow設置的目標,以固定的關係移動 |
因爲不一樣的設置擴展出來的參數很是之多,這邊就不作過多的介紹了,簡單介紹幾個常見的設置,其餘設置請你們自行查閱文檔,若後續有使用到也會進行介紹。
Binding Mode
該選項主要影響VirtualCamera的偏移(Offset)和阻尼(Damping)的計算方式,有如下幾種座標空間供選擇:
Lock To Target | VirtualCamera相對於Follow目標的模型空間計算偏移,當目標旋轉,Camera也會跟着旋轉,保持偏移量不變。 |
Lock To Target With World Up | 與Lock To Target不一樣的是,該模式下會忽略模型的x和z的轉動,只有y軸轉動時,Camera纔會跟着旋轉 |
Lock To Target No Roll | 與Lock To Target不一樣的是,該模式下會忽略模型的z的轉動,當x或y軸轉動時,Camera會跟着旋轉 |
Lock To Target On Assign | 測試時感受和Lock To Target沒什麼區別,待定。。。 |
World Space | VirtualCamera在世界座標中相對於Follow目標原點的計算偏移,當目標旋轉時,VirtualCamera的位置不會發生變化 |
Simple Follow With World Up | VirtualCamera在世界座標中相對於Follow目標在世界座標中移動的方向的計算偏移和阻尼(不受在Y軸移動影響),例如一開始Camera在目標的世界座標z軸負方向位置,當目標向世界座標x軸正方向移動時,Camera會慢慢移動到目標的世界座標x軸負方向位置。相似於小弟在屁股後面跟着的效果 |
注:單獨測試跟隨效果的時候最好不要設置Look At目標,以防干擾。
Damping
阻尼,數值越小,Camera響應的越快。當Damping設置爲0時,Camera會和目標同步運動,若Damping大於0,Camera的運動會慢於目標。
X Damping | 維持offset的x軸值時的阻尼 |
Y Damping | 維持offset的y軸值時的阻尼 |
Z Damping | 維持offset的z軸值時的阻尼 |
Pitch Damping | 當目標沿自身x軸轉動時,Camera跟隨目標時的阻尼 |
Yaw Damping | 當目標沿自身y軸轉動時,Camera跟隨目標時的阻尼 |
Roll Damping | 當目標沿自身z軸轉動時,Camera跟隨目標時的阻尼 |
Aim
Aim的設置主要用於指定VirtualCamera的旋轉規則,主要有以下六大類:
Do nothing | 不對Virtual Camera作任何旋轉 |
Composer | 保持Camera始終看向目標 |
Group Composer | 可使Camera看向多個目標,若是看向的目標是Cinemachine Target Group,會自動調整Camera的FOV和距離,來確保組裏的全部對象都能被看見 |
Hard Look At | 保持Look At的目標始終在屏幕中間,該選項沒有額外的設置 |
POV | 經過用戶輸入來旋轉Virtual Camera |
Same As Follow Target | Virtual Camera的Rotation值保持和Follow目標的Rotation值相同(所以使用此模式必須設置Follow目標)。若是咱們Body選擇的是Hard Lock to Target,那麼就能夠經過Follow的目標來控制Camera的路徑和旋轉 |
Noise
噪點,使用該屬性能夠利用Virtual Camera模擬Camera抖動的效果。Cinemachine中有一個名爲 Basic Multi Channel Perlin 的組件,能夠利用Perlin noise來移動Virtual Camera(Perlin noise是一種能夠經過天然行爲計算隨機運動的技術)。
Noise Profile
Basic Multi Channel Perlin組件須要設置一個配置文件,每一個配置文件都屬於一個Asset,用來定義隨着時間變化的噪點行爲。
Cinemachine自帶了幾個配置文件,咱們能夠編輯它們或者建立本身的配置文件,內容以下:
Pivot Offset
當相機由於抖動旋轉時,偏移相機中心點的座標。(2.6.3新增)
Amplitude Gain
振幅,該值會與Profile中設置的Amplitude值相乘,例如設置爲1,等於使用Profile中設置的Amplitude。
Amplitude值越大,則抖動的幅度會越大。
Frequency Gain
頻率,該值會與Profile中設置的Frequency值相乘,例如設置爲1,等於使用Profile中設置的Frequency。
Frequency值越大,則抖動的速度會越快。
Extensions
該部份內容較多,留到後續講解。
CinemachineBrain
CinemachineBrain是Cinemachine中另外一個核心組件,能夠稱之爲大腦。它掛載在Camera上,監控着場景中全部active狀態(Live和Standby)的VirtualCamera。若一個inactive狀態的VirtualCamera,其Priority值大於等於當前Live狀態的VirtualCamera,當咱們將其設置爲active狀態,那麼CinemachineBrain就會選擇它做爲新的Live狀態的VirtualCamera。咱們可使用這種方法來實現鏡頭的切換。
注:咱們也可使用Timeline來控制VirtualCamera,這種狀況Timeline的處理邏輯會覆蓋CinemachineBrain的。
CinemachineBrain的設置以下:
Show Debug Text
開啓後會在Game視圖中顯示當前Live狀態下的VirtualCamera的文本信息,如圖:
Show Camera Frustum
開啓後在Scene視圖中會始終顯示Camera的視錐體。
Ignore Time Scale
使VirtualCamera響應用戶的輸入和阻尼時忽視TimeScale的設置。
World Up Override
用於指定VirtualCamera在世界空間中向上的向量,若爲空,則爲世界空間中Y軸的方向,即 (0, 1, 0)。不然使用設置的目標的Y軸的方向。使用好該設置對於避免萬向節鎖(gimbal-lock)很是重要。
Update Method
VirtualCamera更新位置和旋轉的方式
Fixed Update | VirtualCamera的更新與物理模塊同步 |
Late Update | 在MonoBehaviour的LateUpdate中更新 |
Smart Update | 每一個VirtualCamera根據其目標的更新方式來更新,推薦使用。 |
Manual Update | VirtualCamera不會自動更新,必須咱們手動的調用ManualUpdate()來更新(應該在Camera跟隨或看向的目標移動後調用) |
注:Smart Update具體是經過UpdateTracker實現的。在必定時間內(UpdateStatus.kWindowSize = 30,即30幀內),經過調用UpdateTracker.OnUpdate(UpdateTracker.UpdateClock),能夠計算出VirtualCamera的目標在fixedUpdate移動次數多仍是在lateupdate移動的次數多,用來判斷下一段時間用fixedUpdate仍是lateUpdate。具體能夠看UpdateTracker.OnUpdate方法。
Blend Update Method
主攝像機混合和更新的時機
Fixed Update | 僅在Update Method使用的是Fixed Update而且在混合時發現劇烈震動時使用 |
Late Update | 在MonoBehaviour的LateUpdate中出來,推薦使用 |
Default Blend
用於設置兩個VirtualCamera混合的方式,除Cut外,其它方式可在後面設置一個混合的持續時間。
Cut | 瞬切,立馬顯示下個VirtualCamera的畫面 |
Ease In Out | S型曲線,混合開始和結束時比較平滑(慢->勻速->慢) |
Ease In | 混合結束時比較平滑(勻速->慢) |
Ease Out | 混合開始時比較平滑,而後勻速到結束(慢->勻速) |
Hard In | 混合開始時很很慢(從超級慢開始加速) |
Hard Out | 混合結束時很很慢(從較快速度減速到超級慢) |
Linear | 勻速移動 |
Custom | 自定義混合曲線 |
Custom Blends
在前面的設置中,設置的是全部的VirtualCamera的混合方式,可是假如當咱們的場景中有多個VirtualCamera,而且不一樣的VirtualCamera之間的混合方式不盡相同的時候,就須要經過該屬性來設置不一樣VirtualCamera之間的混合方式了。會生成一個Asset用來存儲數據,具體設置以下。
Camera Cut Event
當一個VirtualCamera變爲Live狀態,而且其混合方式爲Cut的狀況下觸發
brain.m_CameraCutEvent.AddListener(CameraCutEvent); void CameraCutEvent(CinemachineBrain brain) { Debug.Log(brain); }
Camera Activated Event
當一個VirtualCamera變爲Live狀態時觸發,若帶有混合,則觸發在混合開始的第一幀。
brain.m_CameraActivatedEvent.AddListener(CameraActivatedEvent); //第一個參數爲新的Live狀態的VirtualCamera,第二個參數爲上一個Live狀態的VirtualCamera void CameraActivatedEvent(ICinemachineCamera liveCamera, ICinemachineCamera lastCamera) { Debug.Log(liveCamera); Debug.Log(lastCamera); }
Cinemachine鼓勵咱們多建立VirtualCamera,由於VirtualCamera只會消耗很小的性能。咱們能夠將除了正在使用的VirtualCamera都關閉,來達到最佳的性能。
也建議一個鏡頭使用一個VirtualCamera,例如兩個角色對話的過場動畫,咱們可使用三個VirtualCamera,一個看向兩個角色中間,另外兩個分別給角色特寫,而後利用Timeline來同步聲音和VirtualCamera。例如一開始開啓着看向屏幕中間的VirtualCamera,當其中一個角色須要單獨特寫的時候,再開啓對應的VirtualCamera,當不須要特寫的時候關閉,鏡頭就又會回到看向屏幕中間的VirtualCamera。
暫時先只介紹了具體參數含義,後續將介紹更多的使用情景