前言
你是否曾想過如何輕鬆實現【攝影機追蹤】、【推拉鏡頭】、或是【分鏡效果】?如果是的話,那麼 Unity 的 Cinemachine 插件絕對是你不可或缺的開發利器!作為一款功能強大且靈活的攝影機工具,Cinemachine 不僅能讓你的遊戲場景更具表現力,更是許多開發者的首選的官方插件。本篇文章將帶你深入探索 Cinemachine 的實用功能,並分享多種精選案例,幫助你快速上手並靈活運用。為了讓內容更加實用,我會持續優化文章,補充更精煉的要點,讓每位讀者都能獲益匪淺。除了詳細的【案例分享】,文章中還附加了許多實用的【補充說明】,以協助大家更全面地掌握這款工具,從而提升開發過程中的創意和效率。
希望本篇文章能成為你學習 Cinemachine 的指南,並激發更多靈感!也歡迎大家多多支持原作者的內容,一起為更好的遊戲開發努力!
插件介紹
Cinemachine 是 Unity 官方推出的一款專業攝影機工具插件,專為提升遊戲中的【攝影機效果】與【畫面表現力】而設計。無論是【動態追蹤】、【視角切換】,還是【特效鏡頭處理】,Cinemachine 都能輕鬆實現。它可以讓開發者專注於遊戲創作,而非繁瑣的攝影機邏輯,極大地提升了工作效率和畫面品質,並且適用於多種遊戲類型,是許多 Unity 開發者打造高水準遊戲的首選插件。
功能特色
- 智能追蹤與動態視角切換
無需編寫複雜代碼,即可輕鬆實現攝影機追蹤目標、切換視角等效果。例如玩家角色的動作會自動觸發攝影機移動,實現流暢的畫面過渡,提升玩家的沉浸感。 - 自動化的鏡頭控制與調節
支持自動適配場景需求,攝影機能根據遊戲物體的行為實時調整,包括【推拉鏡頭】、【縮放視角】等,讓場景效果更加生動且符合故事氛圍。 - 分鏡系統整合
Cinemachine 與 Unity 的 Timeline 無縫結合,可以輕鬆製作【過場動畫】與【分鏡效果】,幫助開發者快速構建遊戲的劇情表現,極大地提升製作效率。 - 平滑過渡與碰撞檢測
提供高效的碰撞檢測與攝影機過渡功能,防止畫面穿模,確保攝影機運行流暢且畫面穩定,為玩家帶來更好的遊戲體驗。 - 多樣化預設與靈活自定義
提供多種內建預設,開發者還可根據需求自定義鏡頭參數,例如【視角範圍】、【目標跟隨速度】、【震動效果】等,滿足不同遊戲的特殊需求。
適用場景
- 角色扮演與冒險遊戲
在 RPG 和冒險遊戲中,Cinemachine 可用於實現攝影機追蹤角色移動,並隨劇情觸發多樣化鏡頭效果,例如【俯視視角】切換到【特寫鏡頭】,增加敘事的張力。 - 動作與射擊遊戲
在動作或射擊遊戲中,Cinemachine 能讓攝影機自動鎖定敵人、跟隨玩家動作,並在【擊殺】或【爆炸】場景中快速切換角度,營造震撼的戰鬥體驗。 - 劇情動畫與分鏡場景
在劇情動畫中,Cinemachine 與 Timeline 的結合可以輕鬆實現高品質的分鏡效果,例如過場動畫的【動態攝影機移動】和【鏡頭切換】,讓遊戲更具故事性和電影感。 - 益智與解謎遊戲
在解謎遊戲中,Cinemachine 可用於設計巧妙的鏡頭變化,例如隨玩家動作展開【全景畫面】,或縮放到【細節場景】,幫助玩家更直觀地觀察解謎線索。
插件下載
在 PackageManager 中搜尋 Cinemachine,點選 Install 安裝即可。
本文所使用的 Unity 版本為 2021.3.1f1c1,Cinemachine 版本為 2.8.4,最新的板本已經更新到 3.1.2。
本文我要解釋插件的案例,所以需要把 Samples 也引進到工程中,點選 Samples 的 Import 按鈕。
完成後我們就可以在工程中看到 Cinemachine 的插件包和案例包了,如下。
現在我們開始吧~
註:本文解釋的案例順序不是依照目錄順序,而是根據常用程度進行排序。
Unity 案例 1:第三人稱自由視角,Free Look character 場景
場景示範
雙擊開啟 Free Look character 場景。
這是第三人稱自由視角的攝影機效果,如下。
大家可以看下面這張圖,會比較好理解。
組件參數
CinemachineBrain:核心
主攝影機上掛 CinemachineBrain 組件,參數預設即可,它是整個虛擬相機系統的核心。
CinemachineFreeLook:第三人稱自由視角相機
CM FreeLook1 節點上掛了 CinemachineFreeLook 組件,它實現了第三人稱自由視角的相機邏輯,是非常常用的一個相機功能。
下面我介紹一下這個組件的參數設定。
設定 Follow:跟隨
我們需要設定追蹤的目標物體,這裡設定追蹤的目標是主角的 Root 節點。
如下。
設定了 Follow 對象,攝影機就會跟著追蹤的對象移動了。
設定 LookAt:朝向
設定 LookAt,可以讓相機角度始終朝著目標的方向,這裡設定的是看向主角的頭。
如下。
我們可以看到相機的 Z 軸(藍色的那根軸)始終朝著主角的頭。
三個圓環軌道:環繞約束
攝影機圍繞主角環繞的範圍是由三個圓環軌道決定的,如下。
我們可以調整這三個圓環軌道的高度和半徑,如下。
如下。
圓環軌道之間的連接曲線:Spline Curvature
三個圓環之間有一條連接的曲線,它是攝影機在垂直方向上移動的約束,你可以把它想像成就是一根彎曲的桿子,在它對面有一根形狀與它一樣的隱形的桿子,相機只能在這根隱形的桿子上移動。
我們可以調整 Spline Curvature 來調整這根連接桿的彎曲程度。
如下。
相機移動策略,移動阻尼:Body Y/Z Damping
我們有三個圓環軌道,分別對應三個機位視角:頂部機位、中部機位、底部機位。
我們可以調整每個機位的相機移動阻尼、畫面構圖等,以 Middle Rig 中部機位為例。
我們可以調整相機跟隨的移動阻尼,阻尼越大,跟隨速度越慢。
Y Damping 用於控制相機在垂直方向上的跟隨阻尼,例如角色跳躍的時候,相機也會跟著在豎直方向上“跳”,相機的“跳” 會受到這個 Y Damping 阻尼影響。
同理,Z Damping 控制垂直於螢幕方向移動的阻尼,例如角色往垂直於螢幕的方向走,相機也跟著往前,相機在這個方向上的跟隨受到 Z Damping 阻尼的影響。
注意:阻尼可以減少因相機速度過快而出現畫面震動的效果。
阻尼為 0 會顯得跟隨很僵硬,可能出現畫面震動;阻尼過大則會導致相機跟隨太慢,跟不上主角。
我調整 Z Damping 給大家示範一下,先看下 Z Damping 為 1 時的效果。
接著我把 Z Damping 阻尼調大到 20,可以看到相機跟隨已經跟不上主角的移動了,特別是主角跑起來的時候,建議保持默認的 1 即可。
相機旋轉策略,瞄準:Aim
展開 Aim 下拉按鈕。
我們可以在 Game 試圖中看到出現了一些線條和一些區域塊,如下,它是透過約束相機的旋轉來達到讓瞄準的物體顯示在畫面區域內的。
如果你沒有顯示上面的線條和區域,檢查 Game Window Guides 是否是勾選狀態。
我們可以切換瞄準的策略,預設是 Composer。
每種瞄準策略意義如下。
瞄準策略 | 說明 |
---|---|
Composer | 將目標保持在相機鏡頭內,可設定多種約束。 |
Group Composer | 將多個目標保持在相機鏡頭內。 |
Hard Look At | 將 Look At 目標固定在鏡頭中心的位置。 |
POV | 根據使用者的輸入旋轉相機。 |
Same As Follow Target | 將相機的旋轉和跟隨目標的旋轉同步。 |
以下以 Composer 策略為例,介紹一下各個參數的用途。
瞄準偏移:Tracked Object Offset
Tracked Object Offset 相參數控制對於追蹤目標的偏移,例如我們 Look At 的目標是 Head 節點,但是這個節點與主角的真實頭部偏了一些,我們就可以透過調整 Tracked Object Offset 來校準瞄準的位置。
如下。
預測:Lookahead
參數 | 說明 |
---|---|
Lookahead Time | 預測提前的秒數,預設為 0,如果大於 0,會預測目標的位置,如果主角移動速度很快,可以適當進行預測,如果主角移動速度不快,但開啟了預測,可能會導致相機抖動。 |
Lookahead Smoothing | 預測演算法的平滑度,提高平滑度可以減少預測抖動,但會導致預測滯後。 |
Lookahead ignore Y | 預測演算法會忽略Y軸的移動。 |
我們把 Lookahead Time 調大到 1。
效果如下,可以看到,過度預測導致了相機的震動。
我們保持 1 秒 Lookahead Time,此時我們把 Lookahead Smoothing 調大到 8。
效果如下,可以看到,相機提前預測了目標位置,抖動平滑了一些,但是由於我們的主角移動速度並不快,預測導致相機超前,最後還得折返回來,所以這裡我們沒有必要開啟預測。
如果你的專案的主角是飛機,飛行速度快,可以考慮開啟預測。
Lookahead Ignore Y 就是忽略 Y 軸方向上的預測,例如跳躍動作,我們不想讓相機做 Y 軸上的預測,就可以勾選它。
一般情況下,我們都不需要開啟預測,保持為 0 即可。
瞄準阻尼:Horizontal/Vertical Damping
注意,這個和 2.2.5 小節講的 Body Y/Z Damping 阻尼是不同的,Body Y/Z Damping 是移動阻尼,而 Horizontal/Vertical Damping 是旋轉阻尼。
為了方便觀察,我先把 Follow 設為 None,讓相機固定位置不動。
現在我們先看 Horizontal Damping 為 0.5 時的效果,此時水平旋轉阻尼比較小,相機的旋轉是可以跟上主角的移動的。
現在我們把 Horizontal Damping 調整到 3,效果如下,可以看到,相機的水平旋轉由於阻尼的作用而出現了滯後,適當的阻尼可以減少抖動,過大的阻尼會帶來滯後,我們保持預設的 0.5 就好了。
畫面構圖(重要)
喜歡攝影的同學應該都聽過構圖,例如三分法、中央對稱法、對角線三角形、留白、黃金比例等等。在 Cinemachine 中,提供了 Dead Zone、Soft Zone 來約束主角在畫面中的位置,我們可以調整對應的參數來實現自己的畫面構圖。
Dead Zone 和 Soft Zone 區域如下。
Dead Zoon 範圍內,主角的移動不會觸發相機的旋轉,為了演示,我把 Dead Zone 調大一點點,我們可以透過 Dead Zone Width 和 Dead Zone Height 來調整 Dead Zoon 的區域大小。
可以看到,Dead Zoon 範圍內,主角的移動不會觸發相機的旋轉,只有當主角的位置超出了 Dead Zone 的區域,才會觸發相機的旋轉。
我們可以把 Dead Zone 區域調至 0,這樣主角只要發生移動,就會觸發相機的旋轉。
同理,Soft Zone 的區域是一個緩衝區域,在這個區域內,相機會插值旋轉(慢慢旋轉),直至把主角「推」 回到 Dead Zone 內,如果主角的位置超過了 Soft Zone 的區域,相機就會立刻旋轉確保主角留在 Soft Zone 區域內。
例如我現在把 Soft Zone 區域調小。
測試效果如下,可以看到,當主角嘗試超過 Soft Zone 區域時,相機的旋轉速度會立刻跟上,確保主角在 Soft Zone 。
Screen X 和 Screen Y 是用來調整整個 Zone 的螢幕位置的。
例如把整個 Zone 調整到螢幕左下角,這樣主角在畫面中的位置就是左下角了。
Bias X 和 Bias Y 用來調整 Soft Zoon 相對於整個 Zoon 的位置偏移。
效果如下。
小結
這個案例中,我們主要設定 CinemachineFreeLook 組件的 Follow、LookAt 對象,調整移動阻尼:Body Y/Z Damping,調整一下 Aim 的 Dead Zone、Soft Zone 就差不多了,可以快速應用到自己的實際專案中。
用程式碼控制相機移動(繞著圓環旋轉)
等我們移動滑鼠的時候,相機會圍繞圓環軌道移動,如下。
這是因為 CinemachineFreeLook 組件監聽了 Mouse Y、Mouse X 輸入,它根據滑鼠的移動去控制相機的移動。
如果我們先停用它本身的這個控制,可以把這兩個 Input Axis Name 設為空。
接著,我們在程式碼中去設定 CinemachineFreeLook 組件的 m_XAxis 和 m_YAxis 成員的 m_InputAxisValue 即可,例:
using UnityEngine;
using Cinemachine;
public class Main : MonoBehaviour
{
private CinemachineFreeLook vcam;
void Start()
{
vcam = GetComponent<CinemachineFreeLook>();
}
void Update()
{
// 自己通過代碼獲取 x、y分量,比如通過搖桿獲取,這里我就仍然使用 Mouse X 和 Mouse Y吧
var x = Input.GetAxis("Mouse X");
var y = Input.GetAxis("Mouse Y");
// 相機移動
vcam.m_XAxis.m_InputAxisValue = x;
vcam.m_YAxis.m_InputAxisValue = y;
}
}
Unity 案例 2:相機避險不穿牆,Free Look collider 場景
場景示範
雙擊開啟 Free Look collider 場景。
這也是第三人稱自由視角的攝影機效果,在此基礎上加了 CinemachineCollider ,避免相機穿牆的問題,效果如下。
大家可以看下面這張圖,會比較好理解。
組件參數
CinemachineCollider:相機碰撞
在上面案例 1 的基礎上,加多了一個 CinemachineCollider 組件。
Add Extension 拓展
如果你點選 AddComponent 按鈕,你是找不到這個 CinemachineCollider 元件的。
正確的姿勢是點擊 CinemachineFreeLook 的 Add Extension下拉選項,加入 CinemachineCollider 拓展。
Collide Against:被認定為障礙物的 Layer
虛擬相機的碰撞是透過射線偵測來實現的,射線偵測的時候可以傳一個 LayerMask 參數過濾要偵測的層,這裡 Collide Against 參數就是設定被認為障礙物的 Layer,只有被勾選的 Layer 才會參與射線碰撞偵測。
Ignore Tag:忽略碰撞偵測的 Tag
如果我們想要剔除掉某個Tag的物體,不對特定 Tag 的物體進行碰撞偵測,可以設定 Ignore Tag 參數,這裡設定的是 Player,也就是不與主角做碰撞偵測(也就是說攝影機有可能從主角身上穿過)
Transparent Layers:透明層
透明層的物件被認為是透明的,不作為障礙物處理。
或許有同學要問了,上面不是已經有個 Tag 來剔除碰撞偵測物件了嗎,這個透明層是不是有點功能重複了?非也,請往下看。
首先要清楚這個 CinemachineCollider 的功能不僅是確保相機不穿牆,還要確保主角不會被障礙物擋住。
例如下面這種情況(我把 Transparent Layers 設定為 Default,這樣牆壁被認為是透明層),相機並沒有在牆裡面,但是視線被牆擋住了,看不見主角。
我們把 Transparent Layers 改回 Nothing。
此時可以看到,主角畫面沒有被牆擋住了,現在你知道 Transparent Layers 是幹嘛的了嗎~
如果這裡的牆確實是半透明的,那麼我們就可以把它的層加入到 Transparent Layers,比如這裡我特意把牆改為半透明,添加了一個 Wall 層。
效果如下。
Minimum Distance From Target:與目標的最小距離
與目標的最小距離,只有大於最小距離,Cinemachine 才會進行規避障礙物的操作。
Avoid Obstacles:是否避開障礙物
勾選了才會執行避障邏輯。
Distance Limit:碰撞偵測的射線長度
上面我們說到碰撞偵測這裡用的是射線來偵測的,Distance Limit 就是射線的長度,為0的時候則以 Cinemachine 與 Follow 目標的距離為射線長度。
Camera Radius:相機半徑
相機將嘗試與任何障礙物保持此距離。 盡量保持這個值很小。
Strategy:避障策略
避障策略 | 說明 |
---|---|
Pull Camera Forward | 直接讓相機往前走,移動到障礙物之前。 |
Preserve Camera Height | 相機高度不變,透過向左或向右移動來避開障礙物。 |
Preserve Camera Distance | 保持相機和目標的距離不變,避開障礙物。 |
Pull Camera Forward 這種策略攝影機會出現瞬移的問題,如下。
Preserve Camera Height 這種策略攝影機會在水平方向上移動來過渡,而不是像上面那樣瞬移,建議使用這種策略,如下。
Preserve Camera Distance 這種策略由於為了保持距離,攝影機會出現向上躥或像下躥的問題,如下。
Maximum Effort:一次可處理的最多的障礙物數量
一般 4 個就可以了,太高影響性能。
Smoothing Time:相機移動的平滑時間
在距離目標最近的點保持相機的最小秒數。如果場景中障礙物很多,會導致攝影機頻繁避障而出現相機跳動,例如我在主角周圍擺了那麼多障礙物。
此時,就可以適當調大 Smoothing Time,減少多餘的攝影機避障移動。
我們先看下 Smoothing Time 為 0 時的效果,可以看到攝影機很。
現在我們把 Smoothing Time 調大到 2,效果如下,可以看到,攝影機平滑了很多,不會那麼跳了。
Damping:避障後相機恢復位置的阻尼
遮蔽消失後,相機恢復到正常位置的阻尼。
例如我們使用 Pull Camera Forward 避障策略,然後把 Damping 調大,可以看到在遮擋消失後,相機位置有一個平滑的過渡恢復效果。
Damping When Occluded:避障時的相機阻尼
上面的 Damping 是避障後恢復的阻尼,這個 Damping When Occluded 則是避障時的相機阻尼,我們同樣使用 Pull Camera Forward 避障策略進行測試,把 Damping When Occluded 調大,效果如下,可以看到,當出現遮擋時,攝影機不是瞬移了,而是有個阻尼過渡移動過去,看起來貌似與 Preserve Camera Height 避障策略差不多,但 Preserve Camera Height 避障會確保攝影機不穿牆,而這種 Pull Camera Forward 配合 Damping When Occluded 的方式是會存在攝影機穿牆的問題的。
Unity 案例 3:簡單追踪,FollowCam Simple Follow 場景
場景示範
雙擊開啟 FollowCam Simple Follow 場景。
這是一個追蹤一架飛機飛行的攝影機效果,效果如下。
大家可以看下面這張圖,會比較好理解。
組件參數
CinemachineVirtualCamera:虛擬相機
與 CinemachineFreeLook 一樣,CinemachineVirtualCamera 也是繼承 CinemachineVirtualCameraBase,相對來說,CinemachineVirtualCamera 功能更簡單。
Follow 與 LookAt:追蹤目標
同樣也是設定 Follow 和 LookAt 參數,設定追蹤的目標和朝向的目標。
Binding Mode:Body 綁定模式
需要重點講一下 Body 的綁定模式。
大家可以開啟 Transposer 場景。
這個場景幫我們創建了多個 Binding Mode 的虛擬相機,方便我們進行測試。
下文,我將使用一個更直觀的案例進行演示~
Lock To Target On Assign 模式(常用)
當相機追蹤目標被設定的時候,把相機設定到目標物體的局部座標系中,但不跟隨目標物體的旋轉而移動。
簡單講就是:你動我動,你轉我不動。
這種適用於視角固定的追踪,為了方便演示應用效果,我導入另外一個 Package 資源包,該資源包可以在 AssetStore 免費下載使用。
Character Pack: Free Sample 工具下載點
稍微整一下場景,如下。
虛擬相機參數設定,如下。
我們運行,效果如下。
Lock To Target With World Up 模式
相機被設定到目標物體的局部座標系中,但不會跟隨目標物體在 z 軸旋轉, 也不會跟隨目標物體在 x 軸傾斜。
簡單講就是:你動我動,你 x/z 軸轉我不動,你 y 軸轉我動。
同樣,我們使用小男孩演示下鏡頭效果,注意主角身上的 SimpleSampleCharacterControl 組件的移動模式切換成 Tank 模式,
運作效果如下,適合這個視角始終朝著角色背後的情景。
而主角 x 軸旋轉時,相機不會因為主角的旋轉而移動。
Lock To Target No Roll 模式
相機被設定到目標物體的局部座標系中,但不會跟隨目標物體在 z 軸的旋轉。
簡單講就是:你動我動,你 x/y 旋轉我動,你z軸轉我不動。
小男孩效果如下。
這個情景看起來效果與 Lock To Target With World Up 一樣,但如果主角在繞著 x 軸旋轉,相機會跟著移動,如下。
Lock To Target 模式
這是最容易理解的類型,相機被設定到目標物體的局部座標系中,將一直跟隨目標物體旋轉和移動。
簡單講就是:你動我動,你轉我動。
小男孩效果如下。
跟上面的 Lock To Target No Roll 和 Lock To Target With World Up 運行效果一樣,但如果主角在沿著 x、y 軸旋轉,攝影機會跟著移動。
其實對於小男孩的這個情景,你使用 Lock To Target、Lock To Target No Roll 、Lock To Target With World Up 的運行效果一樣,因為這個情景下,小男孩並不會發生 x、y 軸的旋轉。
World Space 模式
相機跟隨目標的偏移是以世界座標來進行計算,並且始終保持在初始設定的狀態。
簡單講就是:你動我動,你轉我不動誒。
聽起來跟 Lock To Target On Assign 模式一樣,其實不一樣,差別就在於 Follow Offset 參數,Lock To Target On Assign 模式是把 Follow Offset 當作目標物體的局部座標系來計算偏移的,而 World Space 模式,則是以世界座標系來計算偏移的。
小男孩運作效果如下。
表現效果與 Lock To Target On Assign 一樣,如果在這種應用情境下,我建議使用 World Space,因為少了一步轉局部座標的過程。
Simple Follow With World Up 模式
使用相機座標系來計算與目標物體的偏移,不會跟隨物體旋轉而改變朝向,相機方向總是向上。
例如這個時候的相機座標係是這樣的。
把這個座標系移動到目標物體的中心位置,然後基於這個座標係做一次 Follow Offset 偏移,即可得到相機的位置。
效果如下。
小男孩運作效果如下。
這一看好像跟 World Space 模式的表現是一樣的,其實不一樣,我們換個視角觀察,我讓小男孩一直往左走,先看下 World Space 。
現在我們看下 Simple Follow With World Up 模式下,小男孩一直往左跑是什麼效果,如下,小男孩是繞著圈圈走的。之前就有一個策劃拿著某款遊戲過來問我,為什麼主角一直往右跑的時候看起來好像是在轉圈圈,我猜那款遊戲用的就是 Simple Follow With World Up 模式。
Unity 案例 4:動畫狀態驅動自由視角,StateDrivenCamera 場景
場景示範
雙擊開啟 StateDrivenCamera 場景。
這是一個根據主角動畫狀態切換攝影機機位效果,預設是一個第三人稱自由視角,當主角跑起來的時候,會切換到一個固定視角的虛擬相機機位,我們運行,在 Scene 窗口看下這個切換過程。
大家可以看下面這張圖,會比較好理解。
元件參數
這個案例我們只要講一下 CinemachineStateDrivenCamera 元件,其它的上文已經講過了。
CinemachineStateDrivenCamera:狀態驅動虛擬相機
父節點:CinemachineStateDrivenCamera
在父節點上掛起 CinemachineStateDrivenCamera 元件。
子節點:多個虛擬相機
子節點可以放置多台虛擬相機。
設定 Animated Target
因為我們需要根據動畫狀態來切換不同的虛擬相機,所以需要給 CinemachineStateDrivenCamera 元件指定 Animated Target,把主角的 Animator 物件賦值給它。
設定 State
我們先看下主角的動畫狀態機,很簡單,只有 Locomotion 和 Sprint 兩個動畫狀態。
我們在 CinemachineStateDrivenCamera 元件上分別為這兩款動畫狀態新增要啟動的虛擬相機,如下。
Unity 案例 5:分鏡/切鏡,ClearShot 場景
ClearShot 翻譯過來是清晰的鏡頭的意思,就是從多個相機鏡頭中選擇一個畫面品質最好的鏡頭,切換過去,表現上就像分鏡的效果。
啥是分鏡呢?首先看下百科的概念。
分鏡 (Storyboard) 又叫故事板。是指電影、動畫、電視節目、廣告、音樂錄影帶等各種影像媒體,在實際拍攝或繪製之前,以圖表的方式來說明影像的構成,將連續畫面以一次運鏡為單位作分解,並且標註運鏡方式、時間長度、對白、特效等。依媒體不同劃分成不同分鏡。常見的有影片分鏡,漫畫分鏡。影片分鏡用以解說一個場景將如何構成,人物以多大的比例收入鏡頭成為構圖、做出什麼動作,攝影機要從哪個角度切入或帶出、攝影機本身怎麼移動、錄映多少時間等。
喜歡看漫畫的同學應該不陌生,一個場景中我們架設多個虛擬相機機位,為了做出最好的畫面表現,我們需要進行鏡頭切換,比如下面的漫畫,一個格子就像是一個機位拍攝的畫面,鏡頭角度、位置等,什麼時候去切換鏡頭,這些對應到 Cinemachine中,就是 ClearShot 要做的事情。
Cinemachine 為我們做了三個場景,我們先運行看下效果。
場景示範
ClearShot 場景
先雙擊開啟 ClearShot 場景,運作效果如下。
場景中架了三台虛擬相機,如下,依照主角是否被遮擋進行最佳切換。
虛擬相機父節點是一個 CinemachineClearShot,下文會介紹這個元件的參數。
大家可以看下面這張圖,會比較好理解。
ClearShot closest 場景
先雙擊開啟 ClearShot closest 場景,運作效果如下。
場景中架了六台虛擬相機,如下,依照與主角的距離進行最適切換。
其中 CinemachineClearShot 子節點虛擬相機中嵌了一個 CinemachineBlendListCamera,下文會介紹這個元件的參數。
大家可以看下面這張圖,會比較好理解。
ClearShot character 場景
雙擊開啟 ClearShot character 場景,運作效果如下。
場景中架設了 5 台虛擬相機。
其中用到了虛擬相機觸發器:CinemachineTriggerAction,用來偵測主角是否進入觸發器區域,然後進行虛擬相機的切換,下文會介紹這個元件的參數。
大家可以看下面這張圖,會比較好理解。
組件參數
CinemachineClearShot:自動選擇/切換最適合的相機
CinemachineClearShot 會根據被觀察目標的最佳畫面質量,從子節點中選擇一個最合適的虛擬相機。
至於它是根據什麼做出最優選擇的,大家可以查看 CinemachineClearShot.cs 原始碼的 ChooseCurrentCamera 方法。
主要是根據虛擬相機的 ShowQuality 和 Priority 兩個參數進行評估的。
而 ShowQuality 又是根據相機是否被遮蔽、與目標的距離等參數來評估的。
如果我們想手動觸發虛擬相機的切換,可以透過程式碼設定虛擬相機的 Priority 參數來提高優先順序。
這裡我們主要講一下如何設定 CinemachineClearShot 組件的參數。
我們只需要在子節點中新增虛擬相機,就會自動在下面的清單中顯示出來,我們設定 Priority 優先權參數即可。
另外,CinemachineClearShot 本身也有 Follow 和 LookAt 參數,如果子節點的虛擬相機沒有設定 Follow 和 LookAt,則會以 CinemachineClearShot 的為準,否則以子節點虛擬相機的 Follow 和 LookAt 為準。
CinemachineBlendListCamera:虛擬相機過渡/混音器
在 ClearShot closest 場景中使用了 CinemachineBlendListCamera,我使用另一個專門的場景來講解。
雙擊打開 BlendListCamera。
場景中放了兩頂 CinemachineBlendListCamera。
我們把預設的虛擬相機停用,把第一台 CinemachineBlendListCamera 激活,可以看到它底下有兩台虛擬相機。
CinemachineBlendListCamera 所做的事情就是按照我們設定的順序進行虛擬相機的過渡,注意,這裡會按照我們排的順序進行過渡,而不會進行像 ClearShot 那樣進行畫面品質評估,下面這個設定的意思就是先在 CM vcam A 虛擬相機狀態停留 0.5 秒,然後用2秒過渡到 CM vcam B,過渡的緩動曲線使用 Ease In Out。
常用的緩動曲線如下。
讓我們調整兩台虛擬相機的位置,如下。
現在我們運行看看效果,可以看到相機從 CM vcam A 過渡到 了 CM vcam B。
我們還可以讓它從 CM vcam B 回到 CM vcam A,我們添加過渡設置,如下。
重新運行,效果如下,可以看到,相機最後又過渡回到了 CM vcam A。
如果我們想要讓這個順序循環執行,可以勾選 Loop。
CinemachineTriggerAction:虛擬相機觸發器
插件中的 Trigger volumes 場景可以針對觸發器進行測試。
可以用它來實現虛擬相機的鏡頭切換。
也可以用來實現機關觸發(例如執行 TimeLine)。
插件中還有一個 Anywhere Door(任意門)場景,用的就是 CinemachineTriggerAction 觸發器來實現兩個世界的無縫穿越的,挺有意思的,效果如下。
下面來講一下 CinemachineTriggerAction 元件的參數設定。
碰撞體勾選 Is Trigger
我們可以打開 CinemachineTriggerAction.cs 查看源碼,裡面其實就是使用 OnTriggerXXX 來偵測碰撞,然後執行對應的反應方法,
注意使用 CinemachineTriggerAction 的物體上,需要帶 Collider,並且勾選 Is Trigger,如下。
設定過濾
我們可以設定 Layer Mask、With Tag 和 Without Tag 來過濾。
只有透過過濾器的偵測才能觸發邏輯。
設定 Skip First
Skip First 可以用來跳過前面 N 此的觸發,例如第一次進入時不想觸發邏輯,則可以把 Skip First 設定為 1,如果想要每次都觸發,則把 Skip First 設定為 0,並勾選 Repeating。
Skip First 邏輯如下。
設定 On Object Enter 響應
進入觸發器,觸發響應邏輯,我們可以設定要執行的行為。
支持的行為如下。
回應行為 | 說明 |
---|---|
Custom | 自訂,使用元件裡的 Event() 自訂觸發函數。 |
Priority Boost | 增加目標虛擬相機的優先級,並將虛擬相機推入優先隊列頂部。 |
Activate | 啟動虛擬相機,並將虛擬相機推入優先隊列頂部。 |
Deactive | 停用目標物體,即執行 SetActive(false)。 |
Enable | 啟動目標元件,即設定組件的 enabled 為 true。 |
Disable | 停用目標元件,即設定元件的 enabled 為 false。 |
Play | 播放 Timeline。 |
Stop | 停止 Timeline。 |
同理,物體離開觸發器會觸發 On Object Exit,我們也可以設定對應的回應行為。
Unity 案例 6:多目標追踪,Dolly Group 場景
場景示範
雙擊開啟 Dolly Group 場景。
運行效果如下。
組件參數
這個場景使用了一個 Timeline 來控制虛擬相機的移動,虛擬相機 LookAt 的目標是一個 TargetGroup 物體。
這個 TargetGroup 物體上掛著 CinemachineTargetGrouop 組件,透過它可以實現虛擬相機同時追蹤多個物體的效果(原理是動態調整相機的 Field Of View 來確保多個物體都在畫面以內),參數比較簡單,主要是設定多個物件物件到列表中即可。
Unity 其他案例補充
我感覺我寫得太詳細了,不知不覺本文內容已經非常長了,再寫下去感覺沒有同學能耐心看完了,其他場景案例我這裡就不挨個講解了,大家可以自己玩玩看。
1.打 BOSS 視角:BossCam 場景。
2.雙重目標:DualTarget 場景。
3.近物透明,FadeOutNearbyObjects 場景。
4.第三人稱瞄準,3rdPersonWithAimMode 場景。
5.鏡頭震動,Impulse 場景。
補充知識(2024/09/02 補充)
CinemachineBrain
- Live Camera 目前虛擬相機。
- Live Blend 要切換的虛擬相機。
- Show Debug Tex t顯示 debug 文字。
- Show Camera Frustum 是否一直顯示虛擬相機照射的範圍。
- Ignore Time Scale 是否時間縮放的影響。
- World Up Override 相機在運鏡的時候,會有一個「上方」的概念,也就是世界座標系下 y 軸的方向,在相機發生旋轉的時候,如果相機本地座標下的 y 軸與世界座標下的 y 軸之間的夾角大於 90 度時,相機會重設自己的方向讓本地的 y 軸和指向「上方」的那個軸之間的夾角小於 90 度。有時候我們不希望這種視角的自動調整,在俯視角遊戲中,這種情況最為明顯,那麼我們就可以在這裡放置一個遊戲對象,也就是用這個遊戲對象的 y 軸來代替世界坐標系下的 y 軸,反正俯視角相機進行突兀的旋轉。
Update Method 指的是虛擬相機的行為與什麼同步。
- Fixed Update 和 Late Update 就不用多介紹了。
- smart update 就是 Unity 會根據實際狀況幫我們選擇如何進行同步。
- manual update 就是我們自己寫程式進行同步。
blend update:指的是兩台虛擬相機之間的切換行為與什麼進行同步。
default blend 是預設的相機切換模式。
- cut 是瞬間切換。
- Ease In Out 一台相機慢慢的加速切出向另一個相機慢慢的減速切入。
- ease in 就是勻速切出慢慢減速切入。
- ease out 是慢慢的加速切出勻速切入。
- hard in 就是加速切入。
- Hard out 就是快速的加速切出。
- linear 就是全程勻速切換。
- custom 就是自訂切入切出曲線。
Custom Blends 不同相機客製不同的切換模式。
Events 相機的觸發事件有兩種。
第一個 cut events 就是相機之間發生了 cut 是瞬間切換要觸發事件。
第二個是相機之間發生的切換,但不是瞬間完成的 cut,那麼在切換的第一幀時,所要觸發的事件。
虛擬相機的本質
其實一個虛擬相機它是配置文件,而非組件。那麼當虛擬相機裡的屬性被設定完畢後,就應盡量避免在遊戲中對其進行修改。
如果你發現自己在遊戲開發中,需要修改一個虛擬相機的多個屬性的話,請考慮再製作一個虛擬相機。它並不會消耗多少的系統資源,而這樣做會更方便你管理你自己的相機行為。
Status、Game Window Guides、save during play
點選 Status 的 solo,讓目前相機立即處於啟動狀態,方便開發測試。
第二個 Game Window Guides 屬性開啟顯示一些邊框提示訊息。
第三個 save during play,如果啟動它,那麼在 play 狀態下對虛擬相機的修改則會被儲存下來。
Heading 相機自動歸位功能
比如說這個 heading 的方向是 target forward,也就是 follow 物件的這個 transform 的前方,那麼相機就會回到玩家的背後。
wait time 表示相機相關的輸入停止之後多久相機開始自動歸位,recentering time 表示相機要花多久的時間才能夠歸位。
除了目標的前方以外,還有世界坐標系的前方 World Forward。
如果你希望相機歸位時有其他位置選擇的話,下面的 Bias 可以設定偏移量。
然後我們看這裡的 position delta,它是根據目標在上一格的位移,來決定相機最終處於什麼位置,其實也就是根據目標的運動方向,來決定相機的位置。
相機在歸位時會把自己放在目標運動的後方,下面多出的這個 velocity filter strength 過濾器,我們透過設定這個過濾器的大小來篩選掉一些不規則的擾動,讓相機的移動更加的平滑。
Axis 根據輸入控制相機旋轉
- Value 旋轉角度值。
- Value Range 旋轉角度範圍。
- Wrap 旋轉是否循環環繞,取消勾選旋轉會被限制再 Value Range 範圍內。
- Speed 旋轉速度。
- Max Speed 輸入軸能夠達到的最大速度。
- Input Value Gain 則表示速度等於這裡的值乘以下面輸入的值(也就是 Input Axis Value)。
- Accel Time 是指轉速從零到最大轉速的時間。
- Decel Time 是指轉速從最大轉速歸零的時間。
- Input Axis Value 就是我們目前的輸入值。
- Invert 決定 X 軸輸入值的方向是否被反轉。
Cinemachine 相關教學影片
如果還想繼續學習的朋友,這裡推薦幾部精彩的影片,大家可以自行觀看、深入了解!
虛擬相機插件網站
【Cinemachine】
————————————————
更多好用插件:【Unity 好用插件推薦】持續更新,一起讓遊戲開發事半功倍!
本文原創(或整理)於亞洲電玩通,未經作者與本站同意不得隨意引用、轉載、改編或截錄。
特約作家簡介
支持贊助 / DONATE
亞洲電玩通只是很小的力量,但仍希望為復甦台灣遊戲研發貢獻一點動能,如果您喜歡亞洲電玩通的文章,或是覺得它們對您有幫助,歡迎給予一些支持鼓勵,不論是按讚追蹤或是贊助,讓亞洲電玩通持續產出,感謝。
BTC |
352Bw8r46rfXv6jno8qt9Bc3xx6ptTcPze |
|
ETH |
0x795442E321a953363a442C76d39f3fbf9b6bC666 |
|
TRON |
TCNcVmin18LbnXfdWZsY5pzcFvYe1MoD6f |