轉(zhuǎn)載請(qǐng)注明出處:??https://blog.csdn.net/weixin_44013533/article/details/131266126
主要參考:
- 官方手冊(cè) Cinemachine Documentation(雖然拉但是權(quán)威,結(jié)合下面的中文版一起食用)
- up大智官方手冊(cè)翻譯版(文后附翻譯版pdf)
- 知乎:Cinemachine Camera詳細(xì)講解和使用(大智版的簡(jiǎn)化版)
- (強(qiáng)烈推薦!?。。〣站up IGBeginner0116
注:本文使用的unity版本是2021.3.25f,cinemachine版本為2.8.9
一 速覽
1.1 cinemachine下載
在package manager安裝cinemachine,并導(dǎo)入samples
1.2 官方示例速覽
參考:Unity新手教程7.2.1-Cinemachine介紹安裝和官方示例
1.3 cinemachine定義
Cinemachine是用于操作Unity攝像機(jī)的一套模塊。Cinemachine解決了跟蹤目標(biāo)、合成、混合和切換鏡頭之間的復(fù)雜數(shù)學(xué)和邏輯問(wèn)題。它旨在顯著減少在開(kāi)發(fā)過(guò)程中耗時(shí)的手動(dòng)操作和腳本修訂次數(shù)。
二 cinemachine詳解
gameobject>cinemachine可以看到不同類型的camera
2.1 Virtual Camera
Cinemachine中的Virtual Camera(虛擬相機(jī))可以說(shuō)是最核心的組件。
使用Cinemachine時(shí),你需要記住一個(gè)準(zhǔn)則:場(chǎng)景中一般只有一個(gè)Unity相機(jī)(除了需要制作分屏等效果的時(shí)候),上面掛著CinemachineBrain腳本;其他相機(jī)使用虛擬相機(jī),可以有很多個(gè)。
給場(chǎng)景添加一個(gè)虛擬相機(jī)的流程如下:
- 菜單欄,選擇GameObject>Cinemachine > Create Virtual Camera。
Unity會(huì)在場(chǎng)景中添加一個(gè)GameObject,上面有一個(gè)Virtual Camera組件。如果你的Unity相機(jī)上沒(méi)有CinemachineBrain腳本,Cinemachine也會(huì)自動(dòng)添加CinemachineBrain腳本到Unity相機(jī)上。 - 如果相機(jī)需要跟隨物體移動(dòng),指定一個(gè)物體到Follow屬性上。虛擬相機(jī)會(huì)自動(dòng)將Unity相機(jī)的位置和Follow物體保持相對(duì)位置,包括Follow物體移動(dòng)的時(shí)候。
- 如果相機(jī)鏡頭需要保持對(duì)準(zhǔn)物體,指定一個(gè)物體到Look At屬性上,這樣相機(jī)鏡頭就會(huì)一直對(duì)準(zhǔn)這個(gè)物體。
- 虛擬相機(jī)還有很多屬性,你可以根據(jù)需要設(shè)置,后面會(huì)詳細(xì)講解??梢詾槲恢酶S和鏡頭對(duì)準(zhǔn)設(shè)置不同的算法,通過(guò)調(diào)節(jié)參數(shù)得到不同感覺(jué)的相機(jī)。
Virtual Camera中的Aim,Body和Noise屬性,用來(lái)控制相機(jī)在移動(dòng)、旋轉(zhuǎn)時(shí)的動(dòng)畫(huà)是什么樣子。
2.1.1 virtual camera參數(shù)通覽
變量 | 解釋 |
---|---|
solo | 切換虛擬相機(jī)是否處于臨時(shí)活動(dòng)狀態(tài)。使用此屬性可在“游戲”視圖中獲得即時(shí)視覺(jué)反饋,以調(diào)整虛擬相機(jī)。 |
Status : Live/Standby/Disable | 當(dāng)前這個(gè)虛擬相機(jī)的狀態(tài)。 Live狀態(tài)為當(dāng)前該虛擬相機(jī)正在操控Unity真實(shí)相機(jī),并且正在跟蹤其目標(biāo)并每幀更新一次。 Standby為當(dāng)前該虛擬相機(jī)正在跟蹤其目標(biāo)并每幀更新一次,但它沒(méi)有控制任何 Unity 攝像機(jī)。這是在場(chǎng)景中啟用的虛擬攝像機(jī)的狀態(tài),但其優(yōu)先級(jí)可能低于實(shí)時(shí)的虛擬攝像機(jī)。 Disable為該虛擬相機(jī)存在但不被允許使用在當(dāng)前場(chǎng)景,他不能實(shí)時(shí)跟蹤其目標(biāo),不消耗任何系統(tǒng)運(yùn)算能力,但是可以在Timeline中生成并使用,如果參與混合也可使用。 |
Game Window Guides | 選中時(shí),Game窗口會(huì)顯示輔助線,顯示出虛擬相機(jī)的各個(gè)屬性。輔助開(kāi)發(fā)調(diào)整參數(shù)屬性。需要LookAt或者Follow屬性其中一個(gè)以上有設(shè)置物體并選擇相關(guān)算法。 |
Save During Play | 如果選中,運(yùn)行中的虛擬相機(jī)屬性可以被保存下來(lái),退出Play狀態(tài)不會(huì)被重置。 |
Priority | 優(yōu)先級(jí),調(diào)整該虛擬相機(jī)的優(yōu)先級(jí)。CinemachineBrain會(huì)根據(jù)這一項(xiàng)來(lái)選擇LiveCamera同步到UnityCamera中。在Timeline中不生效該選項(xiàng)。 |
Follow | 設(shè)置虛擬相機(jī)想要跟隨的目標(biāo)(Body Target),CinemachineComponent管道中的Body組件將會(huì)引用此目標(biāo)并根據(jù)提供給它的規(guī)則和設(shè)置來(lái)定向 vcam。如果該項(xiàng)為空,則虛擬相機(jī)的坐標(biāo)將會(huì)定義相機(jī)的坐標(biāo)。 |
Look At | 設(shè)置虛擬相機(jī)想要關(guān)注的目標(biāo)(Aim Target),CinemachineComponent管道中的Aim組件會(huì)將引用此目標(biāo)并根據(jù)提供給它的規(guī)則和設(shè)置來(lái)定向 vcam。如果該項(xiàng)為空,則虛擬相機(jī)的變換方向?qū)⒍x相機(jī)的方向。 |
Standby Update:Never/Always/Round Robin | 當(dāng)虛擬相機(jī)處于Standby狀態(tài)時(shí)的更新方式。 Never方式為不更新 Always方式為每一幀都更新 Round Robin為循環(huán)更新,將所有待命的虛擬相機(jī)按照優(yōu)先級(jí)大小來(lái)進(jìn)行每一幀的循環(huán)更新(例如有10個(gè)待命的相機(jī),第一幀更新第一個(gè)相機(jī),第2幀更新第2個(gè)相機(jī),…,第11幀更新第1個(gè)相機(jī),以此類推) |
Lens | 設(shè)置該虛擬相機(jī)的Lens屬性,當(dāng)該虛擬相機(jī)被激活且為活躍狀態(tài)時(shí),會(huì)將這些參數(shù)傳遞給Unity真實(shí)相機(jī)。其中Dutch為為鏡頭旋轉(zhuǎn)(為屏幕空間)。 |
Transitions | 相機(jī)混合時(shí)的設(shè)置。 |
Body | CinemachineComponent管道中重要組件,重要設(shè)置參數(shù),配合Follow使用 |
Aim | CinemachineComponent管道中重要組件,重要設(shè)置參數(shù),配合LookAt使用 |
Noise | CinemachineComponent管道中重要組件,重要設(shè)置參數(shù),可以實(shí)現(xiàn)模擬相機(jī)抖動(dòng)效果 |
Extensions | 可以給虛擬相機(jī)添加額外的擴(kuò)展。 |
2.1.2 Status
在任意時(shí)間,每個(gè)Virtual Camera處于下列的狀態(tài)之一:
-
Live活動(dòng)狀態(tài):活動(dòng)狀態(tài)的虛擬相機(jī)會(huì)控制Unity相機(jī)。當(dāng)Cinemachine Brain控制從一個(gè)虛擬相
機(jī)混合到下一個(gè)虛擬相機(jī)時(shí),兩個(gè)虛擬相機(jī)都處于活動(dòng)狀態(tài)。當(dāng)混合結(jié)束后,只會(huì)有一個(gè)活動(dòng)虛擬
相機(jī)。 -
Standby待命狀態(tài):處于待命狀態(tài)的虛擬相機(jī)并不控制Unity相機(jī)。但是它仍然跟隨和瞄準(zhǔn)它的目
標(biāo)物體,并且每幀更新。處于待命狀態(tài)的虛擬相機(jī)的優(yōu)先級(jí)不高于活動(dòng)狀態(tài)的虛擬相機(jī)。 -
Disable禁用狀態(tài):處于禁用狀態(tài)的相機(jī)既不控制Unity相機(jī)也不會(huì)跟隨或瞄準(zhǔn)他的目標(biāo),也不占
用運(yùn)行資源。想要禁用一個(gè)虛擬相機(jī),只要禁用它的GameObject即可。在Scene窗口中,被禁用
的虛擬相機(jī)還會(huì)顯示,但是是禁用狀態(tài)。但是有特殊情況被禁用的相機(jī)仍然可以控制Unity相機(jī):
虛擬相機(jī)正在參與混合或者Timeline控制。
2.1.3 有關(guān)Dutch angle
斜角鏡頭又稱荷蘭式鏡頭(英語(yǔ):Dutch angle)、荷蘭式上下直搖(Dutch tilt)或破水平,是一種劇烈移動(dòng)鏡頭的電影拍攝手法,這種鏡頭手法通常用來(lái)表示迷失、迷惑的氛圍,令畫(huà)面失去平衡感。雖然名為“荷蘭式”,這種手法和荷蘭并無(wú)關(guān)系,而是德國(guó)表現(xiàn)主義電影作品的常用手法,因英文Dutch和德文Deutsch拼寫(xiě)相近而易混淆。具體的做法是在水平方向上傾斜鏡頭,令其與正常視角的水平線成一角度。
圖片來(lái)源:游戲攝影和我的故事:在電子游戲中尋找定格的藝術(shù)
其他效果可參考:
干貨 | 這種鏡頭快絕跡,我得看它最后一眼
Dutch angle很有意思,是電影鏡頭的傾斜角度,明明出自德國(guó)電影手法,為啥被冠以荷蘭dutch,一查還真有淵源,不是簡(jiǎn)單的拼寫(xiě)相近混淆:
Dutch(荷蘭)VS Deutsch(德國(guó))
哪個(gè)名字才是荷蘭的國(guó)名?Holland?還是Netherland?
Google還有一個(gè)有意思的彩蛋,搜索“Dutch angle”會(huì)有意想不到的場(chǎng)面哈哈哈哈。
2.1.4 Standby Update
Controls how often the virtual camera is updated when the virtual camera is not live.
當(dāng)虛擬相機(jī)處于Standby狀態(tài)時(shí)的更新方式。
- Never方式為不更新
- Always方式為每一幀都更新
- Round Robin為循環(huán)更新,將所有待命的虛擬相機(jī)按照優(yōu)先級(jí)大小來(lái)進(jìn)行每一幀的循環(huán)更新(例如有10個(gè)待命的相機(jī),第一幀更新第一個(gè)相機(jī),第2幀更新第2個(gè)相機(jī),…,第11幀更新第1個(gè)相機(jī),以此類推)
2.1.5 Transitions
從其他虛擬相機(jī)轉(zhuǎn)移過(guò)來(lái)影響本虛擬相機(jī)的參數(shù)。
- Blend Hints:blend hint 指的是相機(jī)切換的行為具有怎樣的物理(空間)特征
- none就是對(duì)角度和位置做差值也就是一條線性的切換
- Spherical Position也就是球形切換,如果look at 這里有對(duì)象的話,那么就以它為球心做一球形的切換,也就是相機(jī)劃過(guò)的路徑大致處于一個(gè)球面上
- Cylindrical Position 圓柱形切換,如果lookat 這里有對(duì)象的話,那么就以它為中心在水平平面上做圓形切換,在垂直方向上做線性切換,相機(jī)劃過(guò)的路徑大致處于一個(gè)圓柱體的表面上
- Screen Space Aim When Target 當(dāng)look at 這里的目標(biāo)不一樣時(shí),在屏幕空間之間做切換。這種切換在位置上使用世界坐標(biāo)系,表現(xiàn)出的是普通的線性切換,在角度上則會(huì)根據(jù)兩個(gè)相機(jī)所構(gòu)成的屏幕空間的夾角間做切換。
-
Inherit Position
Inhert position表示這個(gè)虛擬相機(jī)被激活時(shí),不是讓相機(jī)移動(dòng)到虛擬相機(jī)的位置,而是虛擬相機(jī)移動(dòng)到相機(jī)的位置。
在切換虛擬相機(jī)后,相機(jī)的位置并沒(méi)有發(fā)生變化,反而是虛擬相機(jī)的位置變化。目的是使鏡頭切換不那么突兀。
2.2 virtual cameral關(guān)鍵參數(shù)詳解
2.2.1 Body
CinemachineVitualCamera組件中的Body屬性用于設(shè)置相機(jī)移動(dòng)時(shí)使用什么算法。需要首先設(shè)置
Follow屬性。
Cinemachine包含以下移動(dòng)相機(jī)的算法:
- Do Nothing: 不移動(dòng)虛擬相機(jī)
- 3rd Person follow: 將相機(jī)圍繞玩家水平和垂直旋轉(zhuǎn)到跟隨目標(biāo)
- Framing Transposer: 在屏幕空間,保持相機(jī)和跟隨目標(biāo)的相對(duì)位置,可以設(shè)置阻尼。
- Hard Lock to Target: 虛擬相機(jī)和跟隨目標(biāo)使用相同位置
- Orbital Transposer: 相機(jī)和跟隨目標(biāo)的相對(duì)位置是可變的,還能接收用戶的輸入。
- Tracked Dolly: 相機(jī)沿著預(yù)先設(shè)置的軌道移動(dòng)。
- Transposer: 相機(jī)和跟隨目標(biāo)的相對(duì)位置固定,可以設(shè)置阻尼。
2.2.1.1 Do Nothing
選中這個(gè)算法時(shí),激活時(shí)Unity相機(jī)會(huì)固定在當(dāng)前虛擬相機(jī)的位置,不會(huì)移動(dòng)。用于固定位置的鏡頭,
也可以通過(guò)自定義腳本來(lái)控制相機(jī)的位置。
2.2.1.2 3rd Person follow
使用Cinemachine Virtual Camera的第三人稱跟隨功能,可以將相機(jī)保持在相對(duì)于跟隨目標(biāo)的恒定位置和距離(受到阻尼控制的影響),跟蹤目標(biāo)的移動(dòng)和旋轉(zhuǎn)。
第三人稱跟隨系統(tǒng)設(shè)置定義了相機(jī)相對(duì)于目標(biāo)的位置和距離。通過(guò)適當(dāng)?shù)募绨蚱圃O(shè)置,這個(gè)系統(tǒng)可以產(chǎn)生第三人稱攝像機(jī)效果,其中角色在畫(huà)面中有一定偏移,并且相機(jī)俯視角色的肩膀。通過(guò)不同的設(shè)置,它還可以產(chǎn)生第一人稱攝像機(jī)效果。
- Damping 阻尼系數(shù),指攝像機(jī)向x,y,z軸三個(gè)方向移動(dòng)反應(yīng)速度,系數(shù)越小反應(yīng)越快,系數(shù)越大反應(yīng)越慢。官方用rigid和squishier(硬/黏糊柔軟)來(lái)形容。
Rig
- Shoulder Offset 相對(duì)于跟隨目標(biāo)原點(diǎn)的肩膀支點(diǎn)的位置。這個(gè)偏移量位于目標(biāo)模型空間。
- Vertical Arm Length 手相對(duì)于肩膀的垂直偏移量。當(dāng)相機(jī)垂直旋轉(zhuǎn)時(shí),arm長(zhǎng)度會(huì)影響跟蹤目標(biāo)在屏幕空間的偏移。
- Camera Side 明確哪個(gè)位置是相機(jī)的肩膀(0-1,代表left,in-between,right三種狀態(tài))
- Camera Distance 軸點(diǎn)D(相機(jī))距軸點(diǎn)C(手)的距離
Obtacles :內(nèi)置相機(jī)碰撞解決相關(guān)參數(shù)
第三人稱跟隨組件具有內(nèi)置的碰撞解決系統(tǒng),因此當(dāng)目標(biāo)靠近障礙物時(shí),攝像機(jī)位置會(huì)進(jìn)行調(diào)整,以確保它永遠(yuǎn)不會(huì)位于障礙物內(nèi)部;內(nèi)置的碰撞解決意味著無(wú)論有多少障礙物,攝像機(jī)始終能夠?qū)⒛繕?biāo)保持在視野中。
- Camera Collision Fiter 相機(jī)碰撞過(guò)濾器,相機(jī)會(huì)自動(dòng)避免阻礙這些layer。
- Ignore Tag 檢測(cè)忽略的Tag
- Camera Radius 虛擬相機(jī)會(huì)盡量與遮擋物保持不低于這個(gè)距離。如果你看到由于較大的FOV導(dǎo)致相機(jī)穿透了遮擋物內(nèi)部,可以適當(dāng)增加這個(gè)值。
-
Damping Into/From Collision 鏡頭因躲避障礙調(diào)整位置的阻尼系數(shù)
2.2.1.3 Framing Transposer
這節(jié)可以參考b站這個(gè)up的視頻,下面的參數(shù)解釋都很通俗易懂:
- Unity相機(jī)管理:虛擬相機(jī)旋轉(zhuǎn)Composer屬性詳解【Unity Cinemachine】
- 俯視角控制器完善:虛擬相機(jī)跟隨Framing Transposer 詳解【Unity Cinemachine】
選中這個(gè)算法時(shí),Cinemachine會(huì)在屏幕空間將相機(jī)和跟隨物體保持固定的相對(duì)位置關(guān)系。只會(huì)改變相機(jī)的位置,不會(huì)改變相機(jī)的旋轉(zhuǎn)。還可以設(shè)置偏移、阻尼、構(gòu)圖規(guī)則等等。
Framing Transposer算法是為2D和正交相機(jī)設(shè)計(jì)的,主要用于這種情況。但是對(duì)于透視相機(jī)和3D環(huán)境也可以使用。
這個(gè)算法工作流程大概是:首先沿著相機(jī)的Z軸移動(dòng)相機(jī)直到設(shè)定的Camera Distance的XY平面上,然后在XY面上平移,直到目標(biāo)物體在屏幕空間到達(dá)期望的位置。 特別注意:使用Framing Transposer時(shí),會(huì)忽略LookAt 目標(biāo)。
也就是說(shuō),當(dāng)我們的屏幕和 follow對(duì)象之間的關(guān)系相對(duì)固定的時(shí)候,我們一般就會(huì)采用這里的 Framing Transposer。所以呢,它通常被用在2D游戲以及正交相機(jī)當(dāng)中。比如我們新建一個(gè) cinemachine中的2D相機(jī),我們會(huì)發(fā)現(xiàn)它其實(shí)就是一個(gè)使用了 Framing Transposer的虛擬相機(jī)。
Framing Transposer參數(shù)詳解
- Tracked Object Offset:調(diào)整虛擬攝像機(jī)與“跟隨”目標(biāo)的偏移量。
- Lookahead Time:根據(jù)目標(biāo)的運(yùn)動(dòng),調(diào)整虛擬攝像機(jī)與“跟隨”目標(biāo)的偏移量。Cinemachine預(yù)測(cè)目標(biāo)在在未來(lái)數(shù)秒之內(nèi)到達(dá)的位置(0~1.000秒)。這個(gè)功能對(duì)微動(dòng)的動(dòng)畫(huà)敏感,并且會(huì)放大噪點(diǎn),導(dǎo)致非預(yù)期的相機(jī)抖動(dòng)。如果目標(biāo)運(yùn)動(dòng)時(shí)相機(jī)抖動(dòng)不可接受,降低此屬性可能會(huì)使目標(biāo)動(dòng)畫(huà)更流暢。
- Lookahead Smoothing:預(yù)測(cè)算法的平滑度。較大的值可以消除抖動(dòng)預(yù)測(cè)但會(huì)使預(yù)測(cè)滯后。
- Lookahead Ignore Y:如果選中,在預(yù)測(cè)計(jì)算時(shí)會(huì)忽略沿Y軸的移動(dòng)。
- X/Y/Z Damping:相機(jī)嘗試保持x/y/z軸偏移的阻尼系數(shù)。較小的數(shù)字會(huì)使相機(jī)反應(yīng)更快。較大的數(shù)字會(huì)使相機(jī)的反應(yīng)速度變慢。每個(gè)軸使用不同的設(shè)置可以制造出各種類型相機(jī)的行為。
- Target Movement Only:如果啟用該選項(xiàng),則阻尼僅適用于目標(biāo)的運(yùn)動(dòng)。相機(jī)旋轉(zhuǎn)變化則無(wú)阻尼效果。
-
Center On Active:選中時(shí),虛擬相機(jī)激活時(shí)會(huì)將鏡頭中心對(duì)準(zhǔn)物體。不選中時(shí),虛擬相機(jī)會(huì)將目標(biāo)物體放置在最近的dead zone邊緣。
二維參數(shù)
- Screen X/Y:目標(biāo)的水平/垂直屏幕位置。相機(jī)移動(dòng)的結(jié)果是使目標(biāo)處于此位置。
- Soft Zone Width/Height:當(dāng)目標(biāo)處于此范圍內(nèi)時(shí),會(huì)水平/垂直移動(dòng)相機(jī),將目標(biāo)移回到Dead Zone中。Damping屬性會(huì)影響攝像機(jī)的運(yùn)動(dòng)速度。
- Bias X/Y:Soft Zone的中心與目標(biāo)位置的水平/豎直偏移。
- Dead Zone Width/Height:當(dāng)目標(biāo)在此位置范圍內(nèi)時(shí),不會(huì)水平/垂直移動(dòng)相機(jī)。
- Unlimited Soft Zone:如果選中,Soft Zone沒(méi)有邊界
三維參數(shù)
- Camera Distance:沿?cái)z像機(jī)軸與跟隨目標(biāo)保持的距離。
-
Dead Zone Depth:當(dāng)相機(jī)在z軸上與目標(biāo)距離小于這個(gè)值,就不需要調(diào)整相機(jī)在z軸上的位置。(相當(dāng)于二維死區(qū)擴(kuò)充到3維中)
可以看到,z軸方向距離小于dead zone depth時(shí),相機(jī)在z軸并不移動(dòng)(不過(guò)負(fù)距離依舊會(huì)跟隨)
至于參數(shù)為什么取這些范圍,比如damping取0-20,dead zone width/height取0-2,bias取-0.5-0.5,screen x/y取-0.5-1.5,damping和dead zone為啥有關(guān)聯(lián),這些問(wèn)題目前沒(méi)找到參考,以后有緣再研究。
2.2.1.4 Hard Lock to Target
Unity相機(jī)保持和目標(biāo)位置一致。換句話說(shuō),目標(biāo)充當(dāng)虛擬相機(jī)的固定點(diǎn)。
2.2.1.5 Transposer
參考:Unity相機(jī)管理:相機(jī)跟隨之Transposer屬性詳解【Unity Cinemachine】
tranposer 的意思是虛擬相機(jī)將在某個(gè)固定的偏移或距離上跟隨自標(biāo)移動(dòng),這個(gè)固定的偏移就是下面的follow offset。
默認(rèn)offset值是(0, 0, -10),也就是虛擬相機(jī)將在跟隨的過(guò)程中盡量處于相對(duì)于follow目標(biāo)身后10米的位置(damping延緩效果)。至于這個(gè)所謂的身后10米,指的是follow目標(biāo)本地坐標(biāo)系的身后10米,還是世界坐標(biāo)系下的身后10米,則要看下面的binding mode參數(shù)。
Binding Mode綁定模式:從目標(biāo)確定相機(jī)位置時(shí)使用的坐標(biāo)空間。
涉及兩個(gè)知識(shí)點(diǎn):
- local space與global space 本地坐標(biāo)系軸和世界坐標(biāo)系軸
- Pitch Axis,Roll Axis,Yaw Axis三種旋轉(zhuǎn)軸
Roll Axis:翻轉(zhuǎn)軸
Yaw Axis:航向軸
Binding Mode 詳解:
- Lock To Target On Assign:
它表示虛擬相機(jī)會(huì)鎖定自己和目標(biāo)之間的距離,鎖定發(fā)生在這個(gè)虛擬相機(jī)和follow的對(duì)象建立關(guān)系的時(shí)候即assign,此時(shí)虛擬相機(jī)會(huì)出現(xiàn)在目標(biāo)本地坐標(biāo)系下的offset位置。
on assign指的又是什么時(shí)候呢?在非游戲狀態(tài)下只要follow這里有對(duì)象,那就一直是所謂的on asssign狀態(tài)。
游戲狀態(tài)下,只有給follow 賦值或激活相機(jī),才是on assign狀態(tài),此后他們之間的位置關(guān)系就鎖定了,對(duì)象的旋轉(zhuǎn)等操作并不影響相機(jī)位置。 - Lock To Target With World Up:鎖定與對(duì)象的距離,并能繞對(duì)象的世界坐標(biāo)系Y軸旋轉(zhuǎn)相機(jī)
- Lock To Target No Roll:鎖定與對(duì)象的距離,并能繞對(duì)象的本地坐標(biāo)系Y軸旋轉(zhuǎn)相機(jī)
- Lock To Target:本地空間,鎖定到目標(biāo)物體
- World Space:offset方位相對(duì)于對(duì)象的世界坐標(biāo)系,且相機(jī)不會(huì)繞軸旋轉(zhuǎn)
- Simple Follow With World Up:相機(jī)不會(huì)繞對(duì)象的任何一個(gè)軸旋轉(zhuǎn),且盡量不會(huì)在橫向移動(dòng),也就是盡量不會(huì)沿著x軸的方向做移動(dòng)
對(duì)比下繞本地坐標(biāo)系軸旋轉(zhuǎn)和對(duì)象世界坐標(biāo)系軸旋轉(zhuǎn)的區(qū)別:
2.2.1.6 Orbital Transposer
參考:Unity中如何為俯視角色控制器制作相機(jī)行為并讓角色相對(duì)于相機(jī)移動(dòng)【Cinemachine之Orbital Transposer】
我們知道body屬性是用來(lái)控制相機(jī)的移動(dòng)的,那么這個(gè)orbital transposer,就會(huì)限制相機(jī)在這個(gè)紅色圓環(huán)上移動(dòng)。
參數(shù)詳解:
-
Follow offset 決定了紅圈的相關(guān)屬性,y表示了這個(gè)紅色圓環(huán)相對(duì)于追蹤目標(biāo)的高度,z表示了紅色圓環(huán)的半徑,x則表示相機(jī)在這個(gè)圓環(huán)的切線上的偏移。
-
Binding Mode:決定offset所參考的坐標(biāo)空間以及是否考慮對(duì)象三個(gè)旋轉(zhuǎn)軸,與Transposer算法相同(參看上一小節(jié))
-
Recenter To Target Heading:接收不到用戶輸入時(shí),自動(dòng)歸位。
- Enable:是否啟用
- Wait Time:等待延遲時(shí)間,用戶無(wú)輸入后多長(zhǎng)時(shí)間重新自動(dòng)歸位。
- Recentering Time:重新自動(dòng)歸位過(guò)程花費(fèi)的時(shí)間
-
Heading:
-
Bias:相機(jī)圍繞軌道旋轉(zhuǎn)的偏移(0為正后方,±180為正前方)
-
Definition:有四個(gè)參數(shù)Position Delta、Velocity、Target Forward、World Forward。官方定義如下:Choose Position Delta to calculate heading based on the difference in the position of the target from the last update and the current frame. Choose Velocity to use the velocity of the Rigidbody of the target. If the target has no Rigidbody component, reverts to Position Delta. Choose Target Forward to use the target’s local Forward axis as the heading. Choose World Forward to use a constant world-space Forward as heading.
很難理解,根據(jù)我的實(shí)驗(yàn),這里heading不能理解為相機(jī)的旋轉(zhuǎn)朝向,因?yàn)檫@是Aim參數(shù)決定的,Body一定是確定position的參數(shù)。上面binding mode和offset是確定圓環(huán)的大小、方位和相機(jī)在圓環(huán)切線偏移的屬性,這里heading參數(shù)我理解是確定相機(jī)在圓環(huán)的具體位置,翻譯成朝向的話就是指朝向follow對(duì)象的什么位置,或者叫航向?Position Delta和Velocity是通過(guò)對(duì)象位移和速度決定相機(jī)最終停留位置,Target Forward是讓相機(jī)處于follow對(duì)象本地坐標(biāo)軸正后方(Bia為0時(shí)),World Forward是讓相機(jī)處于follow對(duì)象世界坐標(biāo)軸正后方(Bia為0時(shí))。但注意,當(dāng)binding mode為L(zhǎng)ock to Target(包括on assign、no roll with world up),heading選World Forward效果和Target Forward是一樣的,我不知道這是官方的bug還是就是這么設(shè)置的,還是我理解還不到位。下面分別解釋(注:下列加了aim屬性更新相機(jī)的rotation方便game窗口追蹤follow對(duì)象)
- Position Delta和Velocity類似,通過(guò)follow對(duì)象位移或速度確定相機(jī)最終歸位。bias為0時(shí),相機(jī)始終處于follow對(duì)象移動(dòng)方向的后方。
其中Velocity filter strength目的就是通過(guò)設(shè)置速度采樣窗口大小,來(lái)篩選掉一些不規(guī)則的擾動(dòng),讓相機(jī)的移動(dòng)更加的平滑。如下圖可以看到,filter strength為0時(shí),相機(jī)對(duì)follow對(duì)象微動(dòng)反應(yīng)依舊靈敏;filter strength為10時(shí),相機(jī)對(duì)follow對(duì)象微動(dòng)反應(yīng)不靈敏。 - Target Forward / World Forward 會(huì)讓相機(jī)保持在軌道的「follow對(duì)象本地 / 世界坐標(biāo)軸后方(-z軸)」(bias為0時(shí))
- Position Delta和Velocity類似,通過(guò)follow對(duì)象位移或速度確定相機(jī)最終歸位。bias為0時(shí),相機(jī)始終處于follow對(duì)象移動(dòng)方向的后方。
-
-
X Axis: 相機(jī)在軌道位置控制。此處的設(shè)置控制攝像機(jī)響應(yīng)玩家輸入的行為。具體控制諸如相機(jī)在圓環(huán)上的范圍(range),相機(jī)在圓環(huán)上移動(dòng)速度/加速度等。
2.2.1.7 Tracked Dolly
這個(gè)算法可以讓相機(jī)沿預(yù)定路徑移動(dòng)。使用Path Position屬性來(lái)指定將虛擬相機(jī)放置在路徑上的位
置。使用Auto-Dolly模式可將虛擬相機(jī)移動(dòng)到路徑上最接近Follow目標(biāo)的位置。
-
Path:相機(jī)移動(dòng)的路徑。此屬性必須引用CinemachinePath或Cinemachine Smooth Path對(duì)象。
-
Path Position:沿路徑放置相機(jī)的位置。直接給這個(gè)屬性作動(dòng)畫(huà)或啟用Auto-Dolly。這個(gè)值以Position Units指定的單位為單位。
-
Position Units:路徑位置的度量單位。
- Path Units: 沿路徑使用路徑點(diǎn)。0表示路徑上的第一個(gè)路徑點(diǎn),1表示第二個(gè)路徑點(diǎn),依此類推。
- Distance: 沿路徑使用距離。根據(jù)路徑的Resolution屬性對(duì)路徑進(jìn)行采樣。Cinemachine創(chuàng)建一個(gè)距離查找表,并將其存儲(chǔ)在內(nèi)部緩存中。
- Normalized: 使用路徑的開(kāi)頭和結(jié)尾。值0表示路徑的起點(diǎn),值1表示路徑的終點(diǎn)。
-
Path Offset: 相機(jī)相對(duì)于路徑的位置。X 垂直于路徑,Y 向上,Z 平行于路徑。使用此屬性可使相機(jī)偏離路徑本身
-
X ,Y,Z Damping: 相機(jī)嘗試保持 x ,y,z軸偏移的響應(yīng)程度。小數(shù)字使相機(jī)更靈敏。數(shù)字越大,相機(jī)響應(yīng)越慢。每個(gè)軸使用不同的設(shè)置可以產(chǎn)生廣泛的相機(jī)行為。
-
Camera Up: 如何為虛擬攝像機(jī)設(shè)置向上矢量。這會(huì)影響屏幕構(gòu)圖,因?yàn)橄鄼C(jī) Aim 算法嘗試尊重向上方向。
- Default 不修改虛擬相機(jī)的向上方向,而是使用Cinemachine Brain中的World Up Override屬性。
- Path 在當(dāng)前點(diǎn)使用路徑的向上方向。
- Path No Roll 在當(dāng)前點(diǎn)使用路徑的向上方向,但Roll設(shè)置為零。
- Follow Target 使用Follow目標(biāo)的向上向量。
- Follow Target No Roll 使用Follow目標(biāo)的變換中的向上向量,但Roll為零。
-
Auto Dolly: 控制自動(dòng)軌道位置選擇方式。要使用此功能,必須設(shè)置Follow目標(biāo)。
Path
Cinemachine中有兩種Dolly Path組件:
- CinemachinePath組件:每個(gè)路徑點(diǎn)都可以設(shè)置位置、切線和翻轉(zhuǎn)角度,可以最大程度控制路徑。但是如果切線設(shè)置的不合理,相機(jī)在路徑上運(yùn)動(dòng)時(shí)可能會(huì)有不穩(wěn)定的現(xiàn)象。
-
CinemachineSmoothPath組件:每個(gè)路徑點(diǎn)都可以設(shè)置位置和翻轉(zhuǎn)角度。組件中會(huì)使用Bezier算法來(lái)推算路徑點(diǎn)之間的位置。雖然SmoothPath不能完全控制路徑,但是整個(gè)路徑會(huì)更平滑和連續(xù)。推薦優(yōu)先使用??梢员苊獬霈F(xiàn)盡管路徑位置始終是平滑連續(xù)的,但沿路徑設(shè)置動(dòng)畫(huà)時(shí)仍然可能會(huì)產(chǎn)生不穩(wěn)定的現(xiàn)象。
效果:
2.2.2 Aim
CinemachineVitualCamera組件中的Anim屬性用于設(shè)置相機(jī)旋轉(zhuǎn)時(shí)使用什么算法。需要先設(shè)置Look At屬性。
Aim包含以下旋轉(zhuǎn)算法:
- Do Nothing: 不控制相機(jī)的旋轉(zhuǎn)。
- Composer: 保持目標(biāo)物體在鏡頭內(nèi)
- Group Composer: 保持多個(gè)目標(biāo)在鏡頭內(nèi)
- Hard Look At: 保持目標(biāo)在鏡頭的中心
- POV: 基于玩家的輸入旋轉(zhuǎn)相機(jī)
- Same As Follow Target: 相機(jī)的旋轉(zhuǎn)和目標(biāo)的旋轉(zhuǎn)保持同步
POV比較有意思,參數(shù)都很好懂,這個(gè)相機(jī)視角非常適合3D自由視角游戲游戲
Recenter Target 參數(shù)說(shuō)一下(選POV時(shí)其實(shí)也能不選look at,但會(huì)影響歸位rencentering)
- None 相機(jī)歸位時(shí)朝向世界坐標(biāo)軸forward軸
- Follow Target Forward :相機(jī)歸位時(shí)朝向與follow對(duì)象本地坐標(biāo)系forward軸一致(無(wú)follow對(duì)象效果同None)
- Look At Target Forward :相機(jī)歸位時(shí)朝向與look at對(duì)象本地坐標(biāo)系forward軸一致(無(wú)look at對(duì)象效果同None)
2.2.3 Noise
使用Noise屬性可以模擬相機(jī)的晃動(dòng)。Cinemachine中在帶了一個(gè)Basic Multi Channel Perlin算法,可
以給虛擬相機(jī)的運(yùn)動(dòng)添加柏林噪聲。柏林噪音是一種隨機(jī)算法技術(shù),可以給相機(jī)添加比較自然的隨機(jī)運(yùn)
動(dòng)。
2.2.4 extension簡(jiǎn)覽
詳情參考:Extensions章節(jié)
Cinemachine的虛擬相機(jī)可以添加很多擴(kuò)展,通過(guò)擴(kuò)展來(lái)獲得更強(qiáng)的能力。比如Collider擴(kuò)展可以讓相機(jī)被其他物體遮擋時(shí),自動(dòng)避開(kāi)遮擋的物體。
Cinemachine內(nèi)置了幾種擴(kuò)展,你也可以通過(guò)繼承 CinemachineExtension 類來(lái)實(shí)現(xiàn)你自己的擴(kuò)展。
-
CustomLockCameraY : Cinemachine虛擬相機(jī)的附加模塊,用于鎖定攝影機(jī)的Y坐標(biāo)
-
CinemachineFadeOutNearbyObjects : 一個(gè)用于控制淡出著色器的Cinemachine Virtual Camera示例附加模塊
-
CinemachineCameraOffset :可為攝像機(jī)添加最終偏移量
-
CinemachineRecomposer :可對(duì)攝像機(jī)組成進(jìn)行最終調(diào)整。 它旨在用于時(shí)間軸上下文,您希望在其中手動(dòng)調(diào)整程序或記錄的相機(jī)瞄準(zhǔn)的輸出。
-
Cinemachine3rdPersonAim :強(qiáng)制 LookAt 指向屏幕中心,消除噪音和其他校正。 這對(duì)于需要始終精確瞄準(zhǔn)的第三人稱風(fēng)格瞄準(zhǔn)相機(jī)非常有用,即使存在位置或旋轉(zhuǎn)噪聲也是如此。
-
CinemachineCollider :用于對(duì)虛擬攝像機(jī)的最終位置進(jìn)行后處理。 根據(jù)提供的設(shè)置,碰撞器將嘗試通過(guò)遠(yuǎn)離會(huì)阻礙視線的物體來(lái)保持與虛擬相機(jī)的 LookAt 目標(biāo)的視線。該項(xiàng)可以利用在很多游戲場(chǎng)景。
碰撞器使用物理射線投射器。因此,Cinemachine Collider 要求潛在障礙物具有碰撞體體積。 此要求存在性能成本。 如果此成本在您的游戲中過(guò)高,請(qǐng)考慮以不同方式實(shí)現(xiàn)此功能
-
CinemachineConfiner :這個(gè)擴(kuò)展可以將相機(jī)的最終位置限定在一個(gè)區(qū)域內(nèi)。Confier可以在2D或3D模式下運(yùn)行。Mode屬性影響其接受的邊界形狀的種類。在3D模式下,是一個(gè)空間的范圍,需要考慮深度;在2D模式下,是一個(gè)平面的范圍,不必考慮深度。
-
CinemachineConfiner2D :使用Cinemachine Confiner 2D擴(kuò)展來(lái)限制相機(jī)的位置,以便屏幕邊緣保持在2D多邊形定義的形狀內(nèi)。這適用于正交或透視攝影機(jī),前提是攝影機(jī)的前向向量保持平行于邊界形狀的法線(即攝影機(jī)正朝多邊形看,而不是斜朝多邊形看)。
-
CinemachineFollowZoom :調(diào)整相機(jī)的FOV來(lái)保持物體在屏幕上的尺寸。
-
CinemachineStoryboard :在屏幕上顯示一張圖片。
-
CinemachineImpulseListener :當(dāng)你給一個(gè)虛擬相機(jī)添加Impulse Listener擴(kuò)展時(shí),這個(gè)虛擬相機(jī)就能對(duì)震動(dòng)做出反應(yīng),最直觀的就是相機(jī)晃動(dòng)。 該組件需要配合Cinemachine Impulse Listener腳本組件一起使用,可以很快的得出物體振動(dòng)引發(fā)的相機(jī)顫抖特效。
-
CinemachinePostProcessing:使用Cinemachine后處理擴(kuò)展將后處理V2配置文件連接到虛擬相機(jī)。
2.3 Cinemachine Brain
參考:Unity相機(jī)管理:Cinemachine Brain屬性詳解
添加任意虛擬相機(jī)后,main camera會(huì)多出一個(gè)Cinemachine Brain組件(注意main camera的transform等屬性此時(shí)無(wú)法被手動(dòng)修改,將由Cinemachine Brain讀取場(chǎng)景中虛擬相機(jī)的配置,并以此配置來(lái)控制真實(shí)相機(jī)的行為)
Cinemachine Brain是UnityCamera上的一個(gè)組件,相當(dāng)于"大腦",可以在每一幀來(lái)監(jiān)控并計(jì)算場(chǎng)景中所有活動(dòng)的Virtual Cameras的狀態(tài)(位置,方向等),同步選擇其他具有相同優(yōu)先級(jí)的Virtual Cameras中或切換具有更高優(yōu)先級(jí)的Virtual Camera甚至進(jìn)行Virtual Cameras之間的混合(切換)。Virtual Cameras的優(yōu)先級(jí)可以通過(guò)手動(dòng)提前配置或者編寫(xiě)游戲邏輯來(lái)進(jìn)行操控。
2.3.1 Cinemachine Brain 參數(shù)詳解
-
Live Camera 當(dāng)前激活的虛擬相機(jī)(真實(shí)相機(jī)使用此虛擬相機(jī)的配置控制相機(jī)的行為)
-
Live Blend game play狀態(tài)下,顯示相機(jī)切換狀態(tài)
-
Show Debug Text game窗口顯示所使用的相機(jī)名稱和相機(jī)切換狀態(tài)
-
Show Camera Frustum 默認(rèn)相機(jī)只有選中相機(jī)對(duì)象,才會(huì)顯示相機(jī)視錐體,但如果勾選“Show Camera Frustum” 無(wú)論選中什么對(duì)象,都能顯示live 相機(jī)的視錐體。
-
Ignore time scale:表示相機(jī)的行為是否受時(shí)間縮放值的影響
-
World Up Override:用拖入的游戲?qū)ο蟮膟軸來(lái)代替相機(jī)重置時(shí)所用的默認(rèn)世界坐標(biāo)系下的y軸
相機(jī)在運(yùn)鏡的時(shí)候會(huì)有一個(gè)“上方”的概念,默認(rèn)情況下這個(gè)“上方”就是世界坐標(biāo)系下的“上”,也就是世界坐標(biāo)系下y軸的方向。這個(gè)“上方”的概念是干什么用的呢,在相機(jī)發(fā)生旋轉(zhuǎn)的時(shí)候如果相機(jī)本地坐標(biāo)下的y軸,和世界坐標(biāo)下的y軸之間的夾角大于90度時(shí),相機(jī)會(huì)重設(shè)自己的方向,讓本地的y軸和世界坐標(biāo)系y軸之間的夾角小于90度(如果夾角大于九十度會(huì)出現(xiàn)上下顛倒的畫(huà)面所以要始終保持小于90度的邏輯)。
有時(shí)候我們不希望這種視角的自動(dòng)調(diào)整,按照unity給出的說(shuō)法,在俯視角游戲中這種情況最為明顯,那么我們就可以在這里放置一個(gè)游戲?qū)ο?,使用這個(gè)游戲?qū)ο蟮膟軸來(lái)代替相機(jī)默認(rèn)的“上方”,也就是用這個(gè)游戲?qū)ο蟮膟軸來(lái)代替世界坐標(biāo)系下的y軸。
??????
-
Update Method :指的是何時(shí)更新虛擬相機(jī)的位置和旋轉(zhuǎn)。
fixed update
就是虛擬相機(jī)行為與物理引擎同步;late update
就是虛擬相機(jī)行為與畫(huà)面繪制同步;smart update
就是 unity 會(huì)根據(jù)實(shí)際情況,幫我們選擇如何進(jìn)行同步;manual update
就是我們自己編寫(xiě)代碼,控制相機(jī)的行為的同步時(shí)間。推薦默認(rèn)選擇SmartUpdate。 -
Blend Update Method :兩個(gè)虛擬相機(jī)的切換行為與什么同步。這里只有與物理引擎同步(
Fixed Update
)和與畫(huà)面繪制同步(Late Update
)。 -
Default Blend :虛擬相機(jī)之間的切換模式,可以選擇慢速切出切入(Ease In Out)、快速切入(Hard In)、勻速切換(Linear)等
-
Custom Blends :建立資源文件,為不同相機(jī)間定義不同切換方式
-
Camera Cut Event 在這個(gè)列表上的事件只要當(dāng)前場(chǎng)景任何一個(gè)虛擬相機(jī)激活并且沒(méi)有混合時(shí)就會(huì)觸發(fā)
-
Camera Activated Event 這個(gè)列表上的時(shí)間只要任何一個(gè)虛擬相機(jī)激活。如果涉及混合,則事件將在混合的第一幀上觸發(fā)
三 總結(jié)
本篇用了很長(zhǎng)的篇幅學(xué)習(xí)了cinemachine的基礎(chǔ)知識(shí),詳細(xì)了解了虛擬相機(jī)的各個(gè)參數(shù),包括body、aim、cinemachine brain等,著重學(xué)習(xí)了相機(jī)移動(dòng)和旋轉(zhuǎn)的各種算法(Do nothing、3rd Person Follow、Framing Transposer、Hard Lock To Target、Orbital Transposer、Tracked Dolly、Transposer),也了解了一些其他知識(shí)點(diǎn)如Binding Mode中的roll yaw pitch等。利用現(xiàn)在所學(xué)的知識(shí),已經(jīng)能夠很方便地實(shí)現(xiàn)第一/第三人稱視角、2d相機(jī)跟隨、3d自由視角等各種相機(jī)操作。
下一步將繼續(xù)學(xué)習(xí)多相機(jī)系統(tǒng),以及相機(jī)切換等行為,結(jié)合官方案例學(xué)習(xí)如何在不同游戲場(chǎng)景利用cinemachine這個(gè)強(qiáng)大的插件。
四 感想
-
對(duì)比官方手冊(cè)和大佬們的博客視頻,我發(fā)現(xiàn)官方手冊(cè)有很多解釋不夠清晰的地方,但如果有前輩深刻體會(huì)后,簡(jiǎn)單一解釋就很好理解了。(官方手冊(cè)太拉,解釋不到位不說(shuō),還不全。而且還有賣(mài)弄嫌疑,遣詞造句不夠通俗易懂,生怕別人理解了的感覺(jué)。。。)
-
所以后續(xù)學(xué)習(xí)要注意找前輩們的視頻和博客,真的很能節(jié)省時(shí)間抓住精髓。其實(shí)前輩與前輩之間還是有差距的,大佬總能用自己的理解抓住事物的本質(zhì),幾句話講透。而有些前輩只能人云亦云,充當(dāng)個(gè)翻譯,不求甚解,我要以此為戒。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-677950.html
-
學(xué)習(xí)一個(gè)章節(jié)第一步先看要學(xué)什么東西,確定哪些是重點(diǎn),然后搜集已有博客、視頻、官網(wǎng)手冊(cè),確定筆記整體思路和大綱,每一要點(diǎn)依舊按照先面后點(diǎn)的思想,先確定某個(gè)知識(shí)點(diǎn)是干什么的,然后才深入學(xué)習(xí)具體知識(shí)。
具體知識(shí)點(diǎn)的漸進(jìn)學(xué)習(xí)有幾個(gè)層次,第一層熟悉這是什么,以及怎么用;第二層為什么這么用,什么原理;第三層就是如何更好地運(yùn)用,有什么技巧、經(jīng)驗(yàn)等。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-677950.html
到了這里,關(guān)于【學(xué)習(xí)筆記】Unity基礎(chǔ)(九)【cinemachine基礎(chǔ)(body、aim參數(shù)詳解)】(多fig動(dòng)圖示范)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!