基于Cinemachine的第一/三人稱(chēng)過(guò)肩/自由/斜45度/俯視角攝像機(jī)系統(tǒng)
一、功能介紹
Cinemachine是Unity中一款強(qiáng)大的攝像機(jī)插件,可以無(wú)需代碼實(shí)現(xiàn)一些復(fù)雜的效果,也支持通過(guò)腳本擴(kuò)展更復(fù)雜的效果,上手簡(jiǎn)單,Unity2017以上版本都可以使用。
與Camera不同的是,虛擬相機(jī)不是真正的相機(jī),不掛載Camera組件,只是一些數(shù)據(jù),本質(zhì)上是相機(jī)行為的配置文件,來(lái)控制真實(shí)相機(jī)參數(shù),因此必須搭配一個(gè)Camera對(duì)象才能渲染畫(huà)面,故性能消耗要比創(chuàng)建多個(gè)真實(shí)相機(jī)小很多。
本攝像機(jī)系統(tǒng)基于Cinemachine的Virtual Camara實(shí)現(xiàn),實(shí)現(xiàn)了鎖定、旋轉(zhuǎn)、縮放、移動(dòng)、鼠標(biāo)顯示/隱藏、攝像機(jī)位置復(fù)位、限制攝像機(jī)角度、動(dòng)態(tài)掛載跟隨目標(biāo)、切換視角、遮擋透視等功能,并自帶攝像機(jī)碰撞,防止穿墻。
相機(jī)鎖定包含僅水平、僅垂直方向鎖定。
相機(jī)旋轉(zhuǎn)可由鼠標(biāo)左鍵按下移動(dòng)控制,也可直接移動(dòng)鼠標(biāo)控制。
相機(jī)縮放可由鼠標(biāo)滾輪控制,但滾輪控制相對(duì)不夠流暢,故也設(shè)置為鼠標(biāo)Y軸,即上下移動(dòng)鼠標(biāo)控制縮放。
相機(jī)移動(dòng)可由鼠標(biāo)中鍵/右鍵按下移動(dòng)控制。
玩家可通過(guò)相對(duì)靈活多變的控制方式,更自由的探索游戲場(chǎng)景。對(duì)于喜愛(ài)錄制二創(chuàng)劇情的玩家,可以更方便的進(jìn)行運(yùn)鏡,制作出自己的“大片”。
本系統(tǒng)提供了五種視角切換,第一人稱(chēng)、自由視角需要通過(guò)鼠標(biāo)控制攝像機(jī)方向,進(jìn)而控制角色移動(dòng)方向;第三人稱(chēng)過(guò)肩視角通過(guò)A、D鍵控制旋轉(zhuǎn),鼠標(biāo)僅可以上下移動(dòng)視角;斜45度視角及俯視角為固定視角,不可移動(dòng),斜45度視角會(huì)自適應(yīng)視角,無(wú)需鼠標(biāo)控制;俯視角在角色被遮擋時(shí),會(huì)將遮擋物材質(zhì)替換為透明材質(zhì)。
本案例攝像機(jī)系統(tǒng)對(duì)渲染管線(xiàn)沒(méi)有要求,可升級(jí)到URP或HDRP渲染管線(xiàn)。
本案例攝像機(jī)系統(tǒng)基于PC端、舊輸入系統(tǒng)開(kāi)發(fā),通過(guò)鼠標(biāo)鍵盤(pán)進(jìn)行控制,如需移植到其他平臺(tái),需要將相關(guān)輸入修改為對(duì)應(yīng)平臺(tái)的輸入。如果涉及到多平臺(tái)發(fā)布,推薦替換為新輸入系統(tǒng),方便統(tǒng)一管理。案例中引入的官方最新角色控制器資源基于新輸入系統(tǒng)開(kāi)發(fā),可以研究源碼進(jìn)行相關(guān)的學(xué)習(xí),此文檔不作詳細(xì)說(shuō)明。
二、相關(guān)按鍵
注:按鍵可根據(jù)自己喜好進(jìn)行替換。
攝像機(jī)相關(guān)按鍵:
第一人稱(chēng)、自由視角切換:V
第三人稱(chēng)過(guò)肩視角、自由視角切換:B
斜45度視角、自由視角切換:N
俯視角、自由視角切換:M
是否顯示鼠標(biāo):0
鎖定攝像機(jī)Y軸:9
鎖定攝像機(jī)X軸:8
攝像機(jī)旋轉(zhuǎn)控制:按下鼠標(biāo)左鍵移動(dòng)鼠標(biāo)、或直接移動(dòng)鼠標(biāo)
是否由鼠標(biāo)左鍵/右鍵控制攝像機(jī)旋轉(zhuǎn):右Ctrl
攝像機(jī)視野縮放:鼠標(biāo)滾輪、或鼠標(biāo)Y軸
鼠標(biāo)滾輪/鼠標(biāo)Y軸控制攝像機(jī)視野縮放切換:右Alt
攝像機(jī)移動(dòng):按下鼠標(biāo)中鍵/右鍵移動(dòng)鼠標(biāo)
自由視角攝像機(jī)位置復(fù)位:P
CharacterController角色控制器相關(guān)按鍵:
角色奔跑:左Shift+WASD或左Shift+方向鍵
角色走路:WASD或方向鍵
角色跳躍:空格
角色旋轉(zhuǎn)(僅第三人稱(chēng)過(guò)肩視角時(shí)):A、D或方向鍵左右
Rigidbody角色控制器相關(guān)按鍵:
角色沖刺:左Shift+WASD或左Shift+方向鍵
角色奔跑:WASD或方向鍵
角色跳躍:空格
三、設(shè)計(jì)思路
為了降低開(kāi)發(fā)復(fù)雜度,基于Unity資源商店最新第三人稱(chēng)角色控制器(下載鏈接見(jiàn)附錄)進(jìn)行改造,改造后的項(xiàng)目源碼鏈接見(jiàn)附錄。最新第三人稱(chēng)角色控制器支持的Unity版本:2020.3.0或更高。本項(xiàng)目使用Unity 2020.3.33f1c2進(jìn)行開(kāi)發(fā),Cinemachine版本為2.6.15,不同版本插件的參數(shù)面板會(huì)有略微差異。
為了增加攝像機(jī)系統(tǒng)的靈活性及可移植性,將攝像機(jī)控制邏輯單獨(dú)封裝,可以搭配基于Character Controller的角色控制器或基于剛體的角色控制器使用。
攝像機(jī)控制使用的是舊版輸入系統(tǒng)。本案例使用的最新的基于Character Controller的第三人稱(chēng)角色控制器以及第一人稱(chēng)角色控制器,使用了新版輸入系統(tǒng);而基于剛體的角色控制器使用了舊版輸入系統(tǒng)。故在設(shè)置中選擇新舊輸入系統(tǒng)混合的模式,更改設(shè)置后會(huì)重新啟動(dòng)Unity(記得提前保存項(xiàng)目)。
第一/三人稱(chēng)/自由/斜45度/俯視角分別創(chuàng)建Virtual Camara進(jìn)行控制,通過(guò)激活/禁用Virtual Camara以及掛載在Virtual Camara上的腳本完成視角的切換。
Cinemachine可以自動(dòng)跟隨目標(biāo),故將跟隨目標(biāo)設(shè)置為角色的子物體。
通過(guò)控制角色的移動(dòng),修改攝像機(jī)位置。
通過(guò)控制跟隨目標(biāo)的旋轉(zhuǎn),修改攝像機(jī)方向。
通過(guò)調(diào)整Virtual Camara上Cinemachine3rdPersonFollow的Shoulder Offset參數(shù)值,修改攝像機(jī)與角色相對(duì)位置。
通過(guò)調(diào)整Virtual Camara上Cinemachine3rdPersonFollow的Camera Distance參數(shù)值,修改攝像機(jī)與角色相對(duì)距離。
大多教程是直接移動(dòng)鼠標(biāo)控制攝像機(jī)旋轉(zhuǎn),對(duì)于一些要操作UI的游戲不是很方便,而且容易加重3D眩暈,故本案例提供按下鼠標(biāo)左鍵旋轉(zhuǎn)攝像機(jī)的功能。
由于網(wǎng)上教程大多是直接掛載虛擬相機(jī)的跟隨目標(biāo),這使得動(dòng)態(tài)創(chuàng)建出的角色無(wú)法綁定虛擬相機(jī)(比如一些MMO類(lèi)的游戲),故案例中對(duì)虛擬相機(jī)的跟隨目標(biāo)進(jìn)行動(dòng)態(tài)綁定,防止場(chǎng)景切換導(dǎo)致的攝像機(jī)目標(biāo)丟失。
案例會(huì)添加動(dòng)態(tài)創(chuàng)建/銷(xiāo)毀角色,更好的模擬實(shí)際開(kāi)發(fā)的需求。
四、具體實(shí)現(xiàn)
注:在編寫(xiě)過(guò)程中有對(duì)項(xiàng)目進(jìn)行優(yōu)化,故內(nèi)容可能會(huì)與源碼有細(xì)微出入,實(shí)際效果以源碼為主!
(一)基于Character Controller的角色控制器
1、角色控制器及Cinemachine資源導(dǎo)入
首先創(chuàng)建3D空項(xiàng)目,刪除Project Assets目錄下的默認(rèn)場(chǎng)景,設(shè)置新舊輸入系統(tǒng)為混合模式,點(diǎn)擊應(yīng)用后會(huì)自動(dòng)重啟Unity項(xiàng)目,耐心等待即可。

打開(kāi)瀏覽器,下載Unity資源商店最新第三人稱(chēng)角色控制器(下載鏈接見(jiàn)附錄),通過(guò)Package Manager下載并導(dǎo)入。初次下載點(diǎn)擊“添加至我的資源”,然后點(diǎn)擊“在Unity中打開(kāi)”,會(huì)自動(dòng)跳轉(zhuǎn)至當(dāng)前已打開(kāi)Unity項(xiàng)目的Package Manager。(如打開(kāi)多個(gè)Unity項(xiàng)目需要進(jìn)行選擇)

一般情況在瀏覽器資源商店點(diǎn)擊“在Unity中打開(kāi)”會(huì)自動(dòng)打開(kāi)當(dāng)前Unity項(xiàng)目的Package Manager,若無(wú)反應(yīng),可手動(dòng)在Unity中點(diǎn)擊“Window - Package Manager”打開(kāi)Package Manager。

選擇“My Assets”,輸入資源名稱(chēng)進(jìn)行搜索。

初次下載需要點(diǎn)擊“Download”下載資源,網(wǎng)速可能會(huì)導(dǎo)致Package Manager無(wú)法加載資源,或資源下載失敗,可以等網(wǎng)絡(luò)情況良好的時(shí)候再進(jìn)行下載。下載完成后,點(diǎn)擊“Import”導(dǎo)入所有資源。

再下載Unity資源商店最新第一人稱(chēng)角色控制器,方法同上。


安裝以上角色控制器,會(huì)自動(dòng)導(dǎo)入Cinemachine資源。若使用自己實(shí)現(xiàn)的角色控制器,而非以上資源,需要手動(dòng)導(dǎo)入Cinemachine資源。選擇“Unity Registry”(查看所有Unity常見(jiàn)插件),可輸入Cinemachine進(jìn)行搜索,找到后安裝Cinemachine。(若選擇“In Project”可查看僅當(dāng)前項(xiàng)目中安裝的插件)

2、分析源碼
打開(kāi)第三人稱(chēng)角色控制器場(chǎng)景。

運(yùn)行項(xiàng)目,點(diǎn)擊Game窗口,發(fā)現(xiàn)鼠標(biāo)被隱藏;按下鍵盤(pán)上的WASD或方向鍵移動(dòng)角色,Shift+WASD或方向鍵跑步,同時(shí)攝像機(jī)自動(dòng)跟隨;移動(dòng)鼠標(biāo),控制攝像機(jī)旋轉(zhuǎn)。(按下Esc顯示鼠標(biāo),退出運(yùn)行)
通過(guò)查看源碼可知,ThirdPersonController.cs控制攝像機(jī)的相關(guān)邏輯,StarterAssetsInputs.cs控制光標(biāo)顯示/隱藏與輸入。故將相關(guān)的邏輯單獨(dú)進(jìn)行封裝,便于攝像機(jī)系統(tǒng)的移植。
3、準(zhǔn)備工作
(1)角色設(shè)置
雙擊打開(kāi)角色預(yù)制體,將角色下的“PlayerCameraRoot”重命名為“FollowTarget_1st”,作為第一人稱(chēng)視角的跟隨目標(biāo),一般位于角色眼睛高度。

選中FollowTarget_1st后按“Ctrl+D”復(fù)制一份,重命名為“FollowTarget_3rd”,作為第三人稱(chēng)過(guò)肩視角及斜45度/俯視角的跟隨目標(biāo),一般位于角色肩膀高度。

選中FollowTarget_3rd后按“Ctrl+D”復(fù)制一份,重命名為“FollowTarget_Free”,作為自由視角的跟隨目標(biāo),一般位于角色肩膀高度。
注:因?yàn)樽杂梢暯菚?huì)控制角色身上的跟隨目標(biāo),與其他視角無(wú)法復(fù)用,故需要新建一個(gè)followTarget_Free。

因?yàn)橄鄼C(jī)跟隨目標(biāo)與角色坐標(biāo)保持相對(duì)位置,故部分角色動(dòng)畫(huà)可能出現(xiàn)模型移動(dòng),但實(shí)際角色坐標(biāo)未移動(dòng),此時(shí)模型會(huì)穿過(guò)相機(jī)影響游戲體驗(yàn)。(在播放可能造成攝像機(jī)與角色發(fā)生穿模的技能時(shí),建議切換到第三人稱(chēng)過(guò)肩視角、自由視角或斜45度視角)
雖然可以通過(guò)將跟隨目標(biāo)掛載到頭部骨骼下解決此類(lèi)問(wèn)題,但會(huì)導(dǎo)致角色頭部哪怕輕微移動(dòng),相機(jī)都會(huì)進(jìn)行抖動(dòng),同樣會(huì)影響游戲體驗(yàn),更容易導(dǎo)致玩家出現(xiàn)3D眩暈的狀況。
故可以再?gòu)?fù)制2份模型網(wǎng)格,對(duì)3份網(wǎng)格進(jìn)行設(shè)置,第一份不渲染陰影,第二份掛載透明材質(zhì)并且不渲染陰影,第三份只渲染陰影。
第一人稱(chēng)視角時(shí),隱藏第一份網(wǎng)格,顯示第二份網(wǎng)格。
第三人稱(chēng)過(guò)肩視角、自由視角、斜45度視角、俯視角時(shí),顯示第一份網(wǎng)格,隱藏第二份網(wǎng)格。
如需要在第一人稱(chēng)視角時(shí),只顯示四肢,則只需要將身體設(shè)置為透明材質(zhì)。




在ThirdPersonController.cs中添加圖中代碼,將上面創(chuàng)建的游戲?qū)ο髵燧d到腳本組件對(duì)應(yīng)位置。


(2)相機(jī)設(shè)置
選中相機(jī)預(yù)制體,將相機(jī)的默認(rèn)混合模式設(shè)置為“Cut”(瞬間切換)。(這樣不同模式相機(jī)間會(huì)立即切換,防止第一人稱(chēng)相機(jī)和其他相機(jī)間切換時(shí),相機(jī)穿過(guò)身體)
可以在Custom Blends項(xiàng)點(diǎn)擊Create Asset創(chuàng)建一個(gè)資源文件,控制指定虛擬相機(jī)之間的切換模式。在第一人稱(chēng)相機(jī)和其他相機(jī)切換時(shí)選擇Cut,防止穿幫;在其他相機(jī)之間切換時(shí),設(shè)置合適的切換模式及切換時(shí)長(zhǎng)。(下文中“Camera對(duì)象上的CinemachineBrain組件”部分會(huì)介紹具體參數(shù))

創(chuàng)建Mono單例腳本,命名為“MonoSingleton”(源碼見(jiàn)附錄項(xiàng)目源碼),這樣在切換場(chǎng)景時(shí),虛擬相機(jī)不會(huì)銷(xiāo)毀,就不需要每個(gè)場(chǎng)景都添加了,防止遺漏。
創(chuàng)建空物體,命名為CMVcamManager,作為角色所有虛擬相機(jī)的父物體,方便統(tǒng)一管理。
創(chuàng)建C#腳本,命名為“CMVcamManager”,掛載到CMVcamManager上。
4、功能實(shí)現(xiàn)
(1)自由視角虛擬相機(jī)
實(shí)現(xiàn)思路:
在自由視角中,角色移動(dòng)的方向?yàn)閿z像機(jī)的方向,角色可以轉(zhuǎn)身。攝像機(jī)方向與虛擬相機(jī)方向一致,而虛擬相機(jī)方向由跟隨目標(biāo)決定。那么只要控制跟隨目標(biāo)的方向,就可以控制角色移動(dòng)的方向。而當(dāng)跟隨目標(biāo)為角色的子物體時(shí),跟隨目標(biāo)的方向會(huì)受到角色方向的影響,從而相機(jī)方向也會(huì)受到影響,這會(huì)導(dǎo)致角色在原地旋轉(zhuǎn)。那么通常有兩種解決方案,一種是由虛擬相機(jī)腳本控制跟隨目標(biāo)的方向,使其與虛擬相機(jī)方向保持一致,這樣無(wú)論角色朝向哪里,都不會(huì)影響到相機(jī)的方向;另一種是動(dòng)態(tài)創(chuàng)建一個(gè)游戲?qū)ο螅蛊渑c角色身上跟隨目標(biāo)的位置時(shí)刻保持一致,但方向由虛擬相機(jī)控制,這樣角色方向就不會(huì)影響到相機(jī)了。
注:本案例兩種方案都有涉及,基于Character Controller的角色控制器使用了直接控制跟隨目標(biāo)的方案,基于Rigidbody的角色控制器使用了創(chuàng)建一個(gè)跟隨目標(biāo)的方案。
可以刪除場(chǎng)景中的PlayerFollowCamera,重新創(chuàng)建,也可以用PlayerFollowCamera直接修改。點(diǎn)擊“Cinemachine – Create Virtual Camera”創(chuàng)建虛擬相機(jī),命名為“CMVcam_Free”,在場(chǎng)景中首次創(chuàng)建虛擬相機(jī)會(huì)自動(dòng)在Camera對(duì)象上掛載CinemachineBrain組件,此時(shí)Camera組件的部分屬性已經(jīng)無(wú)法修改,而是由虛擬相機(jī)控制,需要在虛擬相機(jī)組件上進(jìn)行修改。CinemachineBrain組件會(huì)讀取場(chǎng)景中某個(gè)虛擬相機(jī)的配置,并以此配置去控制相機(jī)的行為。

參數(shù)設(shè)置如圖,可根據(jù)需求調(diào)整具體參數(shù)。

Status:Live/Standby/Disabled:虛擬相機(jī)運(yùn)行狀態(tài)(激活/待機(jī)/禁用)
?????? 待機(jī)狀態(tài)表示虛擬相機(jī)并未被CinemachineBrain使用,但虛擬相機(jī)自身還在運(yùn)行當(dāng)中,下面的(Follow)跟隨、(Look At)瞄準(zhǔn)等計(jì)算不一定會(huì)停止。點(diǎn)擊Solo可以將當(dāng)前虛擬相機(jī)立即處于激活狀態(tài),方便在開(kāi)發(fā)時(shí)隨時(shí)觀(guān)察虛擬相機(jī)的工作狀態(tài),并進(jìn)行調(diào)整,但點(diǎn)擊其他地方會(huì)關(guān)閉預(yù)覽。
Game Window Guides:游戲窗口引導(dǎo)(Game窗口顯示虛擬相機(jī)提示信息)
Save During Play:運(yùn)行狀態(tài)保存虛擬相機(jī)的部分參數(shù)修改
Priority:優(yōu)先級(jí)(CinemachineBrain會(huì)使用優(yōu)先級(jí)較高的虛擬相機(jī),在Timeline中無(wú)效)
Follow:虛擬相機(jī)要跟隨的目標(biāo)(具體行為設(shè)置在Body中,Body影響虛擬相機(jī)的位置,是否繞跟隨目標(biāo)旋轉(zhuǎn))
Look At:虛擬相機(jī)要看向的目標(biāo)(具體行為設(shè)置在A(yíng)im中,Aim影響虛擬相機(jī)自身的旋轉(zhuǎn))
Standby Update:待機(jī)狀態(tài)Follow和Look At之類(lèi)的計(jì)算要以什么頻率執(zhí)行/刷新(計(jì)算幀率/刷新頻率)
?????? Never:永遠(yuǎn)不執(zhí)行/刷新
?????? Always:執(zhí)行和刷新的頻率與激活的相機(jī)一致
?????? Round Robin:一種輪替的更新策略(每一幀選擇一個(gè)Standby相機(jī)進(jìn)行更新)
Lens:鏡頭設(shè)置
?????? Field Of View:視野角度(一般不要超過(guò)60)
?????? Near Clip Plane:近裁剪平面(與相機(jī)距離小于這個(gè)數(shù)值的游戲?qū)ο蟛粫?huì)被渲染)
?????? Far Clip Plane:遠(yuǎn)裁剪平面(與相機(jī)距離大于這個(gè)數(shù)值的游戲?qū)ο蟛粫?huì)被渲染)
?????? Dutch:Dutch Angle(斜角鏡頭的角度)(荷蘭角,Dutch是德國(guó)Deutsch,這種斜角拍攝方式流行于德國(guó)表現(xiàn)主義作品當(dāng)中)
Transitions:一些虛擬相機(jī)切換時(shí)的屬性設(shè)置
?????? Blend Hint:相機(jī)切換的行為具有怎樣的物理空間特征
????????????? None:對(duì)角度和位置做差值,線(xiàn)性的切換
????????????? Spherical Position:球形切換(如果Look At有對(duì)象,則以它為球心做球形切換)
????????????? Cylindrical Position:圓柱形切換(如果Look At有對(duì)象,則以它為中心,在水平平面上做圓形切換,在垂直方向上做線(xiàn)性切換)
????????????? Screen Space Aim When Targets Differ:當(dāng)Look At的對(duì)象不一樣時(shí),在屏幕空間之間做切換。在位置上使用世界坐標(biāo)系,表現(xiàn)出普通的線(xiàn)性切換;在角度上根據(jù)兩個(gè)相機(jī)構(gòu)成的屏幕空間的夾角間做切換
?????? Inherit Position:當(dāng)前虛擬相機(jī)被激活時(shí),不改變Camera位置,而是虛擬相機(jī)移動(dòng)到Camera位置
Noise:添加相機(jī)抖動(dòng)效果,可以模擬手持相機(jī)抖動(dòng),本案例關(guān)閉抖動(dòng)效果,可根據(jù)需求選擇是否開(kāi)啟。
Add Extension:添加額外的功能(比如相機(jī)碰撞體,可以防止穿墻)
點(diǎn)擊“Add Extension – CinemachineCollider”添加虛擬相機(jī)碰撞體。(Cinemachine實(shí)現(xiàn)防穿墻很方便,相關(guān)參數(shù)可以查看官方手冊(cè))

創(chuàng)建C#腳本,命名為“CMVcam_Free”,掛載到CMVcam_Free虛擬相機(jī)上。
<1> 移除角色控制器中關(guān)于攝像機(jī)的邏輯
①?? ?剪切ThirdPersonController.cs中代碼
剪切ThirdPersonController.cs圖中黃色框框選的代碼至CMVcam_Free.cs。修改白色框框內(nèi)代碼為“Public”。

② 剪切StarterAssetsInputs.cs中代碼
剪切StarterAssetsInputs.cs圖中黃色框框選的代碼至CMVcam_Free.cs,白色框框選的代碼可以暫時(shí)保留,刪除紅色框框選的代碼。(OnApplicationFocus(bool hasFocus)函數(shù)在玩家獲得或失去焦點(diǎn)時(shí),會(huì)執(zhí)行里面的方法,此處由于cursorLocked = true,即光標(biāo)默認(rèn)設(shè)置為隱藏,所以只要運(yùn)行游戲,就會(huì)隱藏光標(biāo),可以改為“cursorLocked = false”,這樣默認(rèn)是顯示光標(biāo)的。如果想要手動(dòng)控制光標(biāo)的顯示/隱藏,建議刪除OnApplicationFocus(bool hasFocus)函數(shù))

分析可知“cursorInputForLook”可以控制是否獲取鼠標(biāo)移動(dòng)的值,若保留了新輸入系統(tǒng),則也可以通過(guò)控制“cursorInputForLook”的值鎖定攝像機(jī)旋轉(zhuǎn)。但由于此處是同時(shí)獲取鼠標(biāo)X和Y軸的位移量,若鎖定攝像機(jī)會(huì)同時(shí)鎖定X軸和Y軸,無(wú)法單獨(dú)控制其中一個(gè)軸,除非在新輸入系統(tǒng)中進(jìn)行設(shè)置,分別獲取鼠標(biāo)的X軸和Y軸。
為了提高攝像機(jī)系統(tǒng)的可移植性,攝像機(jī)部分的邏輯最終不會(huì)使用到新輸入系統(tǒng),此處可以選擇刪除cursorInputForLook字段及OnLook(InputValue value)函數(shù),在CMVcam_Free.cs中通過(guò)“Input.GetAxis("Mouse X")”和“Input.GetAxis("Mouse Y")”獲取鼠標(biāo)的X軸和Y軸位移量。(詳細(xì)代碼見(jiàn)源碼)

<2> 修復(fù)報(bào)錯(cuò)
全部剪切之后會(huì)發(fā)現(xiàn)CMVcam_Free.cs中的“IsCurrentDeviceMouse”和“_input”報(bào)錯(cuò),這是因?yàn)闆](méi)有引用ThirdPersonController.cs和StarterAssetsInputs.cs腳本。將“_input”全部修改為“inputController”。添加對(duì)應(yīng)的命名空間(“using StarterAssets;”),并暫時(shí)創(chuàng)建為公開(kāi)變量,通過(guò)面板賦值,后面會(huì)改為動(dòng)態(tài)獲取。

將需要的對(duì)象掛載到腳本組件對(duì)應(yīng)位置。

暫時(shí)將跟隨目標(biāo)掛載到虛擬相機(jī)上,后面會(huì)改為動(dòng)態(tài)掛載。

<3> 測(cè)試邏輯
運(yùn)行項(xiàng)目可以正??刂茢z像機(jī)旋轉(zhuǎn),鼠標(biāo)不會(huì)隱藏。此時(shí)禁用CMVcam_Free.cs進(jìn)行測(cè)試,移動(dòng)鼠標(biāo)無(wú)法控制攝像機(jī)旋轉(zhuǎn),角色移動(dòng)時(shí)相機(jī)會(huì)自動(dòng)跟隨,但在角色旋轉(zhuǎn)時(shí),和直接將相機(jī)作為角色子物體效果一樣,相機(jī)會(huì)旋轉(zhuǎn)的很快,容易導(dǎo)致玩家3D眩暈,影響游戲體驗(yàn)。說(shuō)明已將角色控制器中攝像機(jī)相關(guān)邏輯正確獨(dú)立封裝。
<4> 優(yōu)化攝像機(jī)邏輯(動(dòng)態(tài)獲取跟隨目標(biāo)、切換視角)
首先刪除場(chǎng)景中的角色對(duì)象,創(chuàng)建一個(gè)腳本,比如GameManager.cs,用來(lái)動(dòng)態(tài)生成及銷(xiāo)毀角色,按下R可以控制角色的生成及銷(xiāo)毀。(源碼見(jiàn)下圖)
GameManager.cs:

將需要的角色預(yù)制體掛載到腳本組件對(duì)應(yīng)位置。

實(shí)現(xiàn)思路:
跟隨目標(biāo)是角色的子物體,且在ThirdPersonController.cs中引用,故可以通過(guò)獲取ThirdPersonController.cs上的對(duì)象,實(shí)現(xiàn)對(duì)虛擬相機(jī)跟隨目標(biāo)的動(dòng)態(tài)賦值。
為了方便統(tǒng)一管理及邏輯復(fù)用,將CMVcam_Free.cs中的部分邏輯移動(dòng)到CMVcamManager.cs中,比如ThirdPersonController.cs及StarterAssetsInputs.cs的獲取,光標(biāo)的顯示/隱藏等。(源碼如圖)
CMVcamManager.cs:

面板腳本組件上掛載相關(guān)對(duì)象。

CMVcam_Free.cs:

面板腳本組件上掛載相關(guān)對(duì)象,并將虛擬相機(jī)上的Follow和Look At設(shè)置為None。

<5> 測(cè)試動(dòng)態(tài)獲取跟隨目標(biāo)、切換視角
經(jīng)測(cè)試,運(yùn)行之后自動(dòng)會(huì)創(chuàng)建角色,并獲取跟隨目標(biāo)。按R角色會(huì)被銷(xiāo)毀,虛擬相機(jī)丟失跟隨目標(biāo),再按R會(huì)創(chuàng)建角色,并獲取跟隨目標(biāo)。

默認(rèn)是自由視角,按下V切換到第一人稱(chēng)視角,再按V切換回自由視角;按下B切換到第三人稱(chēng)過(guò)肩視角,再按B切換回自由視角;按下N切換到斜45度視角,再按N切換回自由視角;按下M切換到俯視角,再按M切換回自由視角;相互之間也可以轉(zhuǎn)換。

<6> 增加鼠標(biāo)左鍵旋轉(zhuǎn)、僅X軸或Y軸旋轉(zhuǎn)、鼠標(biāo)滾輪縮放、鼠標(biāo)中鍵/右鍵移動(dòng)攝像機(jī)
由于將攝像機(jī)中所有輸入替換為舊輸入系統(tǒng),故可以刪除或注釋ThirdPersonController.cs中PlayerInput組件相關(guān)腳本以及IsCurrentDeviceMouse屬性。(不要?jiǎng)h除角色上掛載的PlayerInput組件,因?yàn)镾tarterAssetsInputs.cs中會(huì)調(diào)用)
實(shí)現(xiàn)思路:
利用bool變量控制虛擬相機(jī)參數(shù)改變的相關(guān)命令何時(shí)執(zhí)行,按鍵更改bool值即可。(源碼見(jiàn)下圖)
CMVcam_Free.cs:

(2)第一人稱(chēng)視角虛擬相機(jī)
打開(kāi)第一人稱(chēng)視角場(chǎng)景,運(yùn)行項(xiàng)目,發(fā)現(xiàn)由于角色是膠囊體,所以沒(méi)有角色動(dòng)畫(huà),角色旋轉(zhuǎn)由攝像機(jī)控制,所以在角色旋轉(zhuǎn)邏輯上與其他視角會(huì)有一定的差別。
第一人稱(chēng)視角不需要做縮放、移動(dòng)、鎖定X/Y軸等,比自由視角邏輯要少一些,其余邏輯基本一致,可以參考自由視角編寫(xiě)。
實(shí)現(xiàn)思路:
把第一人稱(chēng)的相關(guān)邏輯添加到之前的角色控制器邏輯中,通過(guò)視角切換的bool值控制這兩者邏輯執(zhí)行的時(shí)機(jī)。由于跟隨目標(biāo)是角色的子物體,虛擬相機(jī)控制它的旋轉(zhuǎn)并不能直接影響到角色,所以虛擬相機(jī)需要同時(shí)控制角色的方向。而跟隨目標(biāo)作為子物體,會(huì)受到角色方向的影響。所以需要單獨(dú)控制兩者的X軸和Y軸,分別控制角色的X軸方向,以及跟隨目標(biāo)的Y軸方向。

打開(kāi)FirstPersonController.cs,將角色移動(dòng)旋轉(zhuǎn)相關(guān)的源碼復(fù)制到ThirdPersonController.cs中,將_rotationVelocity開(kāi)放一個(gè)屬性。(源碼見(jiàn)下圖)
ThirdPersonController.cs:

創(chuàng)建虛擬相機(jī),重命名為:“CMVcam_1st”,創(chuàng)建CMVcam_1st.cs腳本,將CMVcam_1st.cs掛載到CMVcam_1st上。(相關(guān)設(shè)置見(jiàn)下圖)

CMVcam_1st.cs:
由于控制角色轉(zhuǎn)向的變量在ThirdPersonController.cs腳本中,所以虛擬相機(jī)控制角色轉(zhuǎn)向時(shí)要調(diào)用ThirdPersonController.cs腳本中的變量。

CMVcamManager.cs:

(3)名字調(diào)整
為了做區(qū)分,將“ThirdPersonController.cs”重命名為“PlayerController_CC.cs”,將“StarterAssetsInputs.cs”重命名為“PlayerInputController_CC.cs”,將角色預(yù)制體“PlayerArmature” 重命名為“Player_CharacterController”。
注:右鍵類(lèi)名,點(diǎn)擊“重命名”修改類(lèi)名,可以一次性將所有引用修改,更加方便。 (為了方便大家對(duì)比,本案例重新導(dǎo)入了一份資源包)(修改類(lèi)名可能會(huì)導(dǎo)致面板上拖拽的引用丟失,檢查并重新拖拽即可)

(4)第三人稱(chēng)過(guò)肩視角
實(shí)現(xiàn)思路:
第三人稱(chēng)過(guò)肩視角與其他視角不同的是,角色的方向以世界坐標(biāo)為基準(zhǔn),不由相機(jī)控制,虛擬相機(jī)的X軸旋轉(zhuǎn)是由角色控制的,鼠標(biāo)僅控制Y軸旋轉(zhuǎn)。所以在角色控制腳本中需要進(jìn)行修改移動(dòng)方式,WS或上下鍵控制角色前進(jìn)、后退,AD或左右鍵控制角色旋轉(zhuǎn)。并且需要添加專(zhuān)門(mén)的動(dòng)畫(huà),可以前進(jìn)、后退、向左旋轉(zhuǎn)、向右旋轉(zhuǎn)(可以通過(guò)鏡像旋轉(zhuǎn)動(dòng)畫(huà),省去一個(gè)動(dòng)畫(huà)資源,補(bǔ)充的動(dòng)畫(huà)資源來(lái)自mixamo網(wǎng)站,詳細(xì)網(wǎng)址見(jiàn)附錄)。
創(chuàng)建虛擬相機(jī),重命名為:“CMVcam_3rd”,創(chuàng)建CMVcam_3rd.cs腳本,將CMVcam_3rd.cs掛載到CMVcam_3rd上。(相關(guān)設(shè)置見(jiàn)下圖)

CMVcam_3rd.cs:

修改狀態(tài)機(jī):
創(chuàng)建一個(gè)Bool變量,命名為“IsStrafe”,創(chuàng)建兩個(gè)Float變量,分別命名為“Horizontal”、“Vertical”。
注:可以參考下面Rigidbody角色控制器中的狀態(tài)機(jī)進(jìn)行封裝,將移動(dòng)動(dòng)畫(huà)和跳躍動(dòng)畫(huà)分離。

創(chuàng)建三組混合樹(shù),分別命名為:“Idle”、“Walk”、“Run”。

PlayerController_CC.cs:

(5)斜45度視角
創(chuàng)建虛擬相機(jī),重命名為:“CMVcam_Quarter”,創(chuàng)建CMVcam_Quarter.cs腳本,將CMVcam_Quarter.cs掛載到CMVcam_Quarter上。(相關(guān)設(shè)置見(jiàn)下圖)

斜45度視角是固定視角,腳本只需要掛載跟隨目標(biāo)即可。
CMVcam_Quarter.cs:

(6)俯視角
創(chuàng)建虛擬相機(jī),重命名為:“CMVcam_OverLook”,創(chuàng)建CMVcam_OverLook.cs腳本,將CMVcam_OverLook.cs掛載到CMVcam_OverLook上。(相關(guān)設(shè)置見(jiàn)下圖)

俯視角是固定視角,腳本只需要掛載跟隨目標(biāo)即可。
CMVcam_OverLook.cs:

(7)遮擋透視
除第一人稱(chēng)視角和俯視角外,其他視角都添加了相機(jī)碰撞體,可以避免相機(jī)被遮擋。
但在俯視角中,因?yàn)槿籼砑酉鄼C(jī)碰撞體會(huì)導(dǎo)致機(jī)位改變,故不具有防遮擋以及防穿墻功能。在角色進(jìn)入室內(nèi)或一些遮擋物下時(shí),將無(wú)法觀(guān)察到角色,故需要采取一定的防遮擋效果。
實(shí)現(xiàn)原理:
常見(jiàn)的防遮擋方案有兩種,一種是當(dāng)相機(jī)被遮擋時(shí),改變相機(jī)的位置、高度等,以此保證相機(jī)能夠看到角色,添加相機(jī)碰撞體就使用了這一原理;另一種是將角色和相機(jī)之間的遮擋物變透明,比如改變遮擋物材質(zhì)的透明度屬性(可以保留材質(zhì)原本的顏色,但對(duì)材質(zhì)Shader類(lèi)型有要求,材質(zhì)要能支持透明效果,且需要操作Shader,相對(duì)比較復(fù)雜,且可移植性不如替換材質(zhì)),或直接替換為預(yù)設(shè)的透明材質(zhì)。
本案例選取了直接替換遮擋物材質(zhì)為預(yù)設(shè)透明材質(zhì)的方案,適用范圍更廣。
實(shí)現(xiàn)思路:
遮擋物的獲取可以用射線(xiàn)檢測(cè),從攝像機(jī)發(fā)出一條射線(xiàn)到角色,“Physics.RaycastAll”可以一次性返回所有檢測(cè)到的對(duì)象信息。只需要在信息發(fā)生改變時(shí),判斷是否需要替換材質(zhì)即可。
注:若一個(gè)對(duì)象上存在多個(gè)材質(zhì),需要?jiǎng)?chuàng)建材質(zhì)數(shù)組,逐個(gè)添加透明材質(zhì),通過(guò)材質(zhì)數(shù)組替換對(duì)象上的材質(zhì)。通過(guò)查閱Unity API(鏈接見(jiàn)附錄)可知,直接使用“GetComponent<Renderer>().materials[i]= alphaMaterial;”會(huì)對(duì)材質(zhì)實(shí)例化,無(wú)法替換材質(zhì)。

創(chuàng)建透明材質(zhì):

創(chuàng)建Obstacle2Transparente.cs腳本,掛載到Camera相機(jī)上。射線(xiàn)是從此腳本掛載的對(duì)象向指定目標(biāo)發(fā)出一條射線(xiàn),檢測(cè)兩者之間的對(duì)象,所以要實(shí)現(xiàn)相機(jī)遮擋透視,此腳本一定要掛載在Camera相機(jī)上。(之所以沒(méi)有之間掛載到俯視角虛擬相機(jī)上,是因?yàn)榍袚Q其他虛擬相機(jī)時(shí),俯視角虛擬相機(jī)由于組件被禁用,故不會(huì)跟隨移動(dòng),所以可能會(huì)導(dǎo)致材質(zhì)無(wú)法還原,因此要掛載在Camera相機(jī)上,這樣再切換相機(jī)時(shí)仍然可以保證透視相關(guān)邏輯正常執(zhí)行)
Obstacle2Transparente.cs:

效果展示:
運(yùn)行項(xiàng)目,當(dāng)角色被遮擋時(shí),遮擋物變透明,角色不被遮擋時(shí),還原材質(zhì)。當(dāng)相機(jī)與角色之間存在多層遮擋時(shí),可以同時(shí)控制多個(gè)遮擋物。

(8)Camera對(duì)象上的CinemachineBrain組件
<1> Live Camera:當(dāng)前正在使用的虛擬相機(jī)配置
<2> Live Blend:當(dāng)前的虛擬相機(jī)切換過(guò)程(在切換時(shí)顯示)
<3> Show Debug Text:顯示Debug文本
可以在Game視窗看到當(dāng)前使用的虛擬相機(jī)和當(dāng)前正在執(zhí)行的相機(jī)轉(zhuǎn)換。
<4> Show Camera Frustum:顯示當(dāng)前的視錐體(相機(jī)的可視范圍)
默認(rèn)只有選中相機(jī)才會(huì)在場(chǎng)景中看到視錐體,勾選之后,無(wú)論是否選中都會(huì)看到,前提是在Gizmos中打開(kāi)了相關(guān)項(xiàng),默認(rèn)是打開(kāi)的。
<5> Ignore Time Scale:相機(jī)的行為是否受時(shí)間縮放值的影響
<6> World Up Override:世界上方覆蓋
相機(jī)在運(yùn)行時(shí)默認(rèn)的“上方”為世界坐標(biāo)系下Y軸的方向,在相機(jī)發(fā)生旋轉(zhuǎn)的時(shí)候,如果相機(jī)本地坐標(biāo)下的Y軸和“上方”之間的夾角大于90°時(shí),相機(jī)會(huì)重設(shè)自己的方向,保證和“上方”的夾角小于90°。比如在俯視角游戲中,不希望出現(xiàn)這種視角的自動(dòng)調(diào)整,就可以在這里放置一個(gè)游戲?qū)ο?,使用這個(gè)游戲?qū)ο蟮腨軸代替相機(jī)默認(rèn)的“上方”。
<7> Update Method:虛擬相機(jī)的行為與什么同步
?????? Fixed Update:與物理引擎同步
?????? Late Update:與畫(huà)面繪制同步
?????? Smart Update:Unity根據(jù)實(shí)際情況智能選擇同步
?????? Manual Update:編寫(xiě)代碼控制相機(jī)行為的同步時(shí)間

<8> Blend Update Method:兩個(gè)虛擬相機(jī)之間的切換行為與什么同步
?????? Fixed Update:與物理引擎同步
?????? Late Update:與畫(huà)面繪制同步

<9> Default Blend:默認(rèn)相機(jī)切換模式
Cut:瞬間切換
?????? Ease In Out:加速切出,減速切入
?????? Ease In:勻速切出,減速切入
?????? Ease In Out:加速切出,減速切入
?????? Ease Out:加速切出,勻速切入
?????? Hard In:加速切入
?????? Hard Out:加速切出
?????? Linear:勻速切換
?????? Custom:自定義切入切出曲線(xiàn)

<10> Custom Blends:自定義切換模式
?????? 點(diǎn)擊Create Asset創(chuàng)建一個(gè)資源文件,指定不同虛擬相機(jī)之間的切換模式。

<11> Events:相機(jī)事件觸發(fā)
?????? Camera Cut Event(CinemachineBrain):相機(jī)之間發(fā)生Cut(瞬間切換)時(shí)觸發(fā)的事件
?????? Camera Activated Event(ICinemachineCamera, ICinemachineCamera):相機(jī)之間發(fā)生其他切換的第一幀時(shí)觸發(fā)的事件

此處在第一人稱(chēng)相機(jī)和其他相機(jī)相互切換時(shí)選擇Cut,防止穿幫;其他相機(jī)之間切換會(huì)使用默認(rèn)為“1秒”的勻速切出,減速切入(Ease In)模式。

(9)Virtual Camara相關(guān)設(shè)置介紹補(bǔ)充
<1> Body
① Transposer
虛擬相機(jī)將在某個(gè)固定的偏移或距離(Follow Offset)上跟隨目標(biāo)移動(dòng)。
Binding Mode:
?????? Lock To Target On Assign:虛擬相機(jī)會(huì)鎖定自己和目標(biāo)之間的距離(鎖定僅發(fā)生在當(dāng)前虛擬相機(jī)和Follow對(duì)象建立關(guān)系(On Assign)的時(shí)候,此時(shí)虛擬相機(jī)會(huì)出現(xiàn)在目標(biāo)本地坐標(biāo)系下的Follow Offset位置)
?????? Lock To Target With World Up:虛擬相機(jī)可以繞跟隨目標(biāo)的垂直方向的偏航軸(Yaw Axis)旋轉(zhuǎn),但自己不會(huì)旋轉(zhuǎn)(可以設(shè)置Yaw Damping)
?????? Lock To Target No Roll:虛擬相機(jī)可以繞跟隨目標(biāo)的偏航軸(Yaw Axis)和俯仰軸(Pitch Axis)旋轉(zhuǎn),但自己不會(huì)旋轉(zhuǎn)(可以設(shè)置Pitch Damping和Yaw Damping)
?????? Lock To Target:虛擬相機(jī)可以繞跟隨目標(biāo)的偏航軸(Yaw Axis)、俯仰軸(Pitch Axis)、橫滾軸(Roll Axis)旋轉(zhuǎn),但自己不會(huì)旋轉(zhuǎn)(如果選擇Euler(歐拉角),可以單獨(dú)設(shè)置Pitch Damping、Yaw Damping、Roll Damping;如果選擇Quaternion(四元數(shù)),則統(tǒng)一設(shè)置所有方向旋轉(zhuǎn)的延遲)
?????? World Space:與Lock To Target On Assign類(lèi)型,但使用的是世界坐標(biāo)系下的坐標(biāo)
?????? Simple Follow With World Up:虛擬相機(jī)不會(huì)繞跟隨對(duì)象的任何一個(gè)軸旋轉(zhuǎn),且盡量不會(huì)沿X軸方向移動(dòng)

Follow Offset默認(rèn)為(0,0,-10),即相機(jī)處于(Follow)跟隨目標(biāo)身后10米位置左右。
Damping是阻尼系數(shù),可以理解為相機(jī)移動(dòng)的延遲。系數(shù)越小,相機(jī)的反應(yīng)就越快。
<2> Aim

① Do nothing
什么都不做。
② Composer
標(biāo)準(zhǔn)的瞄準(zhǔn)模式,可以用來(lái)保證相機(jī)看著目標(biāo)。
?????? Tracked Object Offset:偏移量,虛擬相機(jī)瞄準(zhǔn)的位置(Game視窗上會(huì)顯示一個(gè)黃色的小方塊)與跟隨目標(biāo)位置的偏移
?????? Lookahead Time:目標(biāo)當(dāng)前移動(dòng)速度推測(cè)出偏移量,虛擬相機(jī)會(huì)計(jì)算當(dāng)前目標(biāo)的速度,并預(yù)測(cè)出一段時(shí)間后目標(biāo)的位置,然后添加一個(gè)偏移量。(如果目標(biāo)運(yùn)動(dòng)很隨機(jī),或帶有一定的噪聲(Noise),預(yù)測(cè)可能會(huì)將噪聲放大)
?????? Lookahead Smoothing:可以讓預(yù)測(cè)算法更加平滑,當(dāng)目標(biāo)的運(yùn)動(dòng)情況變化比較大時(shí),可以調(diào)整數(shù)值,消除鏡頭抖動(dòng);但數(shù)值過(guò)大會(huì)導(dǎo)致預(yù)測(cè)的延遲
?????? Lookahead Ignore Y:勾選后,不會(huì)預(yù)測(cè)目標(biāo)垂直方向上的運(yùn)動(dòng)
?????? Horizontal Damping:水平方向阻尼,值越大,虛擬相機(jī)旋轉(zhuǎn)越慢
?????? Vertical Damping:垂直方向阻尼,值越大,虛擬相機(jī)旋轉(zhuǎn)越慢
?????? (Dead Zone(死區(qū))減小虛擬相機(jī)敏感程度,只要瞄準(zhǔn)點(diǎn)(黃色的小方塊)位于Dead Zone區(qū)域內(nèi),虛擬相機(jī)不做轉(zhuǎn)動(dòng))
?????? Screen X:Dead Zone的X軸中心位置(0.5為正中央)
?????? Screen Y:Dead Zone的Y軸中心位置(0.5為正中央)
?????? Dead Zone Width:Dead Zone寬度
?????? Dead Zone Height:Dead Zone高度
?????? (Soft Zone,當(dāng)瞄準(zhǔn)點(diǎn)(黃色的小方塊)位于Soft Zone區(qū)域內(nèi),虛擬相機(jī)通過(guò)轉(zhuǎn)動(dòng)讓瞄準(zhǔn)點(diǎn)(黃色的小方塊)回到Dead Zone內(nèi)。Soft Zone永遠(yuǎn)大于等于Dead Zone)
?????? Soft Zone Width:Soft Zone寬度
?????? Soft Zone Height:Soft Zone高度
?????? Bias X:Soft Zone的X軸偏移量
?????? Bias Y:Soft Zone的Y軸偏移量
?????? (最外層的紅色區(qū)域是瞄準(zhǔn)點(diǎn)(黃色的小方塊)絕對(duì)不會(huì)落入的區(qū)域,虛擬相機(jī)會(huì)通過(guò)轉(zhuǎn)動(dòng),讓瞄準(zhǔn)點(diǎn)(黃色的小方塊)至少落在藍(lán)色區(qū)域(Soft Zone)內(nèi))
?????? Center On Activate:勾選后,當(dāng)前虛擬相機(jī)被啟用時(shí),會(huì)將目標(biāo)放在屏幕的正中央,否則會(huì)把目標(biāo)放在最近的Dead Zone的邊緣位置
③ Same As Follow Target
虛擬相機(jī)角度與跟隨目標(biāo)的角度保持一致。
(二)基于Rigidbody的角色控制器
1、角色控制器資源導(dǎo)入
復(fù)制一份項(xiàng)目,刪除與Character Controller角色控制器相關(guān)的資源及腳本。
打開(kāi)瀏覽器,下載Unity資源商店Rigidbody的第三人稱(chēng)角色控制器(下載鏈接見(jiàn)附錄),通過(guò)Package Manager下載并導(dǎo)入。


2、分析源碼
打開(kāi)角色控制器場(chǎng)景。
運(yùn)行項(xiàng)目,點(diǎn)擊Game窗口,發(fā)現(xiàn)鼠標(biāo)不會(huì)隱藏;按下鍵盤(pán)上的WASD或方向鍵移動(dòng)角色,Shift+WASD或方向鍵沖刺,同時(shí)攝像機(jī)自動(dòng)跟隨;移動(dòng)鼠標(biāo),控制攝像機(jī)旋轉(zhuǎn)。
通過(guò)查看源碼可知,vThirdPersonCamera.cs控制攝像機(jī)的相關(guān)邏輯,沒(méi)有用到插件,vThirdPersonController.cs控制角色行為,vThirdPersonInput.cs獲取角色輸入。
故可以刪除vThirdPersonCamera.cs腳本及ThirdPersonCamera_LITE攝像機(jī)預(yù)制體,替換為之前做好的攝像機(jī)預(yù)制體,并對(duì)角色控制器腳本中的邏輯進(jìn)行改造。

3、準(zhǔn)備工作
(1)名字調(diào)整
如圖,修改預(yù)制體、腳本為對(duì)應(yīng)的名字。(為了方便大家做對(duì)比,此處復(fù)制了一份,進(jìn)行操作,操作時(shí)把導(dǎo)入的資源包先剪切到其他位置,防止重命名時(shí)受到影響)


(2)修復(fù)報(bào)錯(cuò)
由于刪除了之前項(xiàng)目相關(guān)的腳本,故一些引用處會(huì)出現(xiàn)引用丟失的報(bào)錯(cuò),修改對(duì)應(yīng)的命名空間及類(lèi)名。
CMVcamManager.cs:

PlayerController_RB.cs:

PlayerInputController_RB.cs:
刪除紅色框框選的代碼。

在角色預(yù)制體上創(chuàng)建相關(guān)的對(duì)象:
由于角色模型運(yùn)用了LOD技術(shù),所以需要進(jìn)行一些設(shè)置。
由于僅在第一人稱(chēng)視角時(shí)需要切換到部分透明的模型,所以只需要修改LOD 0層的網(wǎng)格,將其添加到LOD 0層。其他設(shè)置參數(shù)之前的做法,此處不做贅述。

將相關(guān)的對(duì)象掛載到腳本組件對(duì)應(yīng)位置。

先注釋CMVcam_1st.cs及CMVcam_3rd.cs中報(bào)錯(cuò)的旋轉(zhuǎn)邏輯相關(guān)代碼。
由于場(chǎng)景中角色的位置及坐標(biāo)不是默認(rèn)值,故在實(shí)例化對(duì)象時(shí)設(shè)置位置及坐標(biāo)。

4、功能實(shí)現(xiàn)
(1)測(cè)試分析
全部設(shè)置好后,運(yùn)行項(xiàng)目,發(fā)現(xiàn)除斜45度和俯視角等固定視角正常外,其他三種視角在旋轉(zhuǎn)時(shí)出現(xiàn)問(wèn)題。
(2)自由視角虛擬相機(jī)
經(jīng)過(guò)測(cè)試,發(fā)現(xiàn)自由視角無(wú)法直接使用控制角色身上跟隨目標(biāo)方向的方案,會(huì)出現(xiàn)相機(jī)抖動(dòng)的情況,跟隨目標(biāo)似乎受到除虛擬相機(jī)之外的邏輯控制,所以這里采用動(dòng)態(tài)創(chuàng)建跟隨目標(biāo)的方案。那么可以刪除角色身上的“FollowTarget_Free” 對(duì)象以及PlayerController_RB.cs和CMVcamManager.cs中的引用,替換為“FollowTarget_3rd”,因?yàn)樗鼈兊奈恢谩⒎较蚴且粯忧叶疾粫?huì)受到除父物體以外的影響。
CMVcam_Free.cs:

(3)第一人稱(chēng)視角虛擬相機(jī)
CMVcamManager.cs:
自由視角、斜45度視角、俯視角時(shí),角色是由按鍵控制轉(zhuǎn)身的,而第一人稱(chēng)視角是由鼠標(biāo)控制轉(zhuǎn)身,因此要鎖定角色方向,通過(guò)“isStrafing”變量切換為“Strafe Locomotion”移動(dòng)方式。

CMVcam_1st.cs:
與Character Controller的角色控制器中不同,由于沒(méi)有其他地方控制角色轉(zhuǎn)向,所以虛擬相機(jī)需要?jiǎng)?chuàng)建變量,命名為“_cinemachineTargetYaw”來(lái)控制角色X軸方向。

(4)第三人稱(chēng)過(guò)肩視角
實(shí)現(xiàn)思路:
與Character Controller的角色控制器相同,也要調(diào)整為WS或上下鍵控制角色前進(jìn)、后退,AD或左右鍵控制角色旋轉(zhuǎn)。并且需要添加專(zhuān)門(mén)的動(dòng)畫(huà),可以前進(jìn)、后退、向左旋轉(zhuǎn)、向右旋轉(zhuǎn)。
Rigidbody的角色控制器中已經(jīng)實(shí)現(xiàn)了Strafe Locomotion移動(dòng)方式,但AD或左右鍵是控制角色左右移動(dòng),而非旋轉(zhuǎn),因此需要修改腳本和動(dòng)畫(huà)。創(chuàng)建bool變量,命名為“CanRotate”,用來(lái)控制動(dòng)畫(huà)及相關(guān)邏輯的切換。
添加動(dòng)畫(huà)變量及新的混合樹(shù):

CMVcamManager.cs:

CMVcam_3rd.cs:

PlayerMotor_RB.cs:

附錄
資源:
【Unity資源商店】最新第一人稱(chēng)角色控制器(Starter Assets - First Person Character Controller): https://assetstore.unity.com/packages/essentials/starter-assets-first-person-character-controller-196525
【Unity資源商店】最新第三人稱(chēng)角色控制器(Starter Assets - Third Person Character Controller):https://www.jianshu.com/go-wild?ac=2&url=https%3A%2F%2Fassetstore.unity.com%2Fpackages%2Fessentials%2Fstarter-assets-third-person-character-controller-196526
【Unity資源商店】第三人稱(chēng)角色控制器(Third Person Controller - Basic Locomotion FREE):https://assetstore.unity.com/packages/tools/game-toolkits/third-person-controller-basic-locomotion-free-82048
【動(dòng)畫(huà)資源】Mixamo動(dòng)畫(huà)資源網(wǎng)站(外網(wǎng),加載會(huì)比較慢):https://www.mixamo.com/#/
?
Unity API:
Renderer.materials(英文):https://docs.unity3d.com/2020.3/Documentation/ScriptReference/Renderer-materials.html
Renderer.materials(中文):https://docs.unity.cn/cn/2020.3/ScriptReference/Renderer-materials.html
?
源碼:
(源碼里包含Word文檔版的這篇專(zhuān)欄,里面圖片清晰點(diǎn))
網(wǎng)盤(pán)鏈接:https://wwul.lanzoue.com/b01jv988h?
密碼:a0xd
(GitHub加載進(jìn)不去的話(huà),可以下載網(wǎng)盤(pán)鏈接里的,包含下面兩種,內(nèi)容是一樣的)
基于Character Controller角色控制器的攝像機(jī)系統(tǒng)源碼:https://github.com/LeahLee13/UnityCameraSystem_CC
基于Rigidbody角色控制器的攝像機(jī)系統(tǒng)源碼:https://github.com/LeahLee13/UnityCameraSystem_RB
?
效果演示:
【Unity】基于Cinemachine的第一/三人稱(chēng)過(guò)肩/自由/斜45度/俯視角攝像機(jī)系統(tǒng)演示:https://www.bilibili.com/video/BV1xF411A7PS/?vd_source=949e43fe30377952898533774f02e413