Cinemachine简介
??先貼一下官方的Cinemachine文檔Cinemachine Documentation
簡(jiǎn)介
使用
??我們第一次使用Cinemachine時(shí)大概是這樣一個(gè)流程:
在需要被控制的Camera上添加一個(gè)CinemachineBrain。
創(chuàng)建一個(gè)自己需要的VirtualCamera。
調(diào)整VirturalCamera上的Follow、Look At等參數(shù)。
調(diào)整VirtualCamera上Body、Aim對(duì)應(yīng)Component的類(lèi)型和參數(shù)。
3個(gè)關(guān)鍵類(lèi)簡(jiǎn)介
CinemachineBrain
??CinemachineBrain是掛在相機(jī)對(duì)象上去真正修改相機(jī)位置的腳本。負(fù)責(zé)通過(guò)VirtualCamera來(lái)計(jì)算真實(shí)相機(jī)的位置。
VirtualCameraBase
??通過(guò)CinemachineCompoent來(lái)計(jì)算相機(jī)位置。
CinemachineComponentBase
??主要分三大類(lèi)Body、Aim、Noise,分別計(jì)算相機(jī)的位置、方向、噪音。
執(zhí)行過(guò)程
??簡(jiǎn)單說(shuō)就是CinemachineBrain每幀通過(guò)VirtualCamera計(jì)算真實(shí)相機(jī)的位置,并同步到真實(shí)相機(jī)上。
??真正的數(shù)據(jù)計(jì)算又是通過(guò)VirtualCamera上的流水線來(lái)計(jì)算的。
??這里只是一個(gè)簡(jiǎn)化的流程說(shuō)明,真實(shí)計(jì)算還有相機(jī)切換時(shí)的混合、流水線之外的Extension、和CinemachineCore對(duì)Cinemachine的全局管理等。
重要腳本
??簡(jiǎn)單了解運(yùn)行流程后,在詳細(xì)的說(shuō)一下這幾個(gè)類(lèi)的實(shí)現(xiàn)與功能。
CinemachineBrain
??CinemachineBrain是掛在相機(jī)對(duì)象上去真正影響相機(jī)位置的腳本。主要負(fù)責(zé)以下三件事:
維護(hù)虛擬相機(jī)的狀態(tài)(主要包括當(dāng)前Brain受哪個(gè)虛擬相機(jī)控制、虛擬相機(jī)切換時(shí)的切換進(jìn)度、Timeline對(duì)Brain的影響)。
通過(guò)虛擬相機(jī)計(jì)算State(虛擬相機(jī)通過(guò)各種參數(shù)計(jì)算出來(lái)的真實(shí)相機(jī)的狀態(tài),包括位置、旋轉(zhuǎn)等)。
將虛擬相機(jī)的State同步到真實(shí)相機(jī)上,可能是多個(gè)虛擬相機(jī)的State混合后的結(jié)果。
重要變量
UpdateMethed
??更新所有與該Brain相關(guān)的虛擬相機(jī),主要是計(jì)算每個(gè)VirtualCamera的State。
SmartUpdate:判斷在一定時(shí)間(具體是通過(guò)UpdateTracker實(shí)現(xiàn)的。這個(gè)一定時(shí)間其實(shí)是一個(gè)固定的幀數(shù):UpdateStatus.kWindowSize,是個(gè)常數(shù)30)該虛擬相機(jī)的target在fixedUpdate移動(dòng)次數(shù)多還是在lateupdate移動(dòng)的次數(shù)多。來(lái)判斷下一段時(shí)間用fixedUpdate還是lateUpdate。
FixedUpdate:在FixedUpdate之后對(duì)虛擬相機(jī)進(jìn)行更新。
LateUdpate:在LateUpdate時(shí)對(duì)虛擬相機(jī)進(jìn)行更新。
BlendUpdateMethod:把VirtualCamera計(jì)算的結(jié)果同步到CinemachineBrain的時(shí)機(jī)。
FixedUpdate:在FixedUpdate之后對(duì)將計(jì)算的數(shù)據(jù)同步到真實(shí)相機(jī)。
LateUdpate:在LateUpdate時(shí)計(jì)算的數(shù)據(jù)同步到真實(shí)相機(jī)。
重要類(lèi)
BrainFrame
??更新并記錄當(dāng)前Brain受哪個(gè)虛擬相機(jī)的的控制、同時(shí)計(jì)算虛擬相機(jī)的切換狀態(tài)。
??Brain中的mFrameStack是用來(lái)處理多Timeline同時(shí)生效的情況。
??FrameStack中的第一個(gè)Frame是Brain每幀Tick游戲中虛擬相機(jī)的結(jié)果。其他的是TimeLine的。
CinemachineBlend
??相機(jī)混合類(lèi),用于描述從相機(jī)A切換到相機(jī)B的過(guò)程。
BlendSourceVirtualCamera
??將CinemachineBlend封裝成一個(gè)VirtualCamera,可以讓A相機(jī)在切換到B相機(jī)的過(guò)程中又切換到C這種情況有一個(gè)平滑的過(guò)度。
Tips
??在做一些相機(jī)跟隨、3DUI跟隨時(shí),要注意一幀中跟隨對(duì)象位置計(jì)算、虛擬相機(jī)State的計(jì)算、State結(jié)果同步、3DUI位置計(jì)算的順序,否則容易出現(xiàn)相機(jī)抖動(dòng)的問(wèn)題。
??如果確定相機(jī)跟隨的物體運(yùn)動(dòng)的時(shí)間點(diǎn),可以選擇LateUpdate或FixedUpdate兩種模式。能省去SmartUpdate時(shí)對(duì)目標(biāo)物體的追蹤開(kāi)銷(xiāo)(就是那個(gè)UpdateTracker)。
虛擬相機(jī)的基類(lèi)VirtualCameraBase
??通過(guò)流水線的方式調(diào)用CinemachineComponent,同時(shí)在流水線中插入CinemachineExtension來(lái)計(jì)算相機(jī)的位置,具體是通過(guò)掛載的CinemachineComponent和CinemachineExtension來(lái)流水線式的計(jì)算一個(gè)CameraState(包含了位置、旋轉(zhuǎn)、視角、額外偏移值等數(shù)據(jù)),通過(guò)CinemachineBrain將其中的數(shù)據(jù)同步到真實(shí)相機(jī)上。
虛擬相機(jī)組件的基類(lèi)CinemachineComponentBase
??通過(guò)VirtualCamera來(lái)創(chuàng)建、刪除、調(diào)用,主要分三大類(lèi)Body、Aim、Noise(還有一個(gè)Final,很少用)。
Body主要用來(lái)計(jì)算相機(jī)的原始位置,也就是state中的RawPosition。
Aim主要用來(lái)計(jì)算相機(jī)的原始旋轉(zhuǎn),也就是state中的RawRotation。
Noise主要用來(lái)計(jì)算相機(jī)的額外偏移值,也就是state中的PositionCorrection和RotationCorrection。
CinemachineExtension
??插入在流水線中間調(diào)用,也用于維護(hù)CameraState。
CinemachineCore
??一個(gè)全局的管理類(lèi),保存當(dāng)前所有有效的CinemachineBrain、VirturalCameraBase對(duì)象引用,定義了各種全局類(lèi)和函數(shù),用于Cinemachine系統(tǒng)的整體調(diào)度。
運(yùn)行過(guò)程
CinemachineBrain詳細(xì)調(diào)用流程
??主要可以分為兩個(gè)時(shí)間節(jié)點(diǎn)和三件事。
時(shí)間節(jié)點(diǎn)
FixedUpdate之后
LateUpdate
三件事
維護(hù)虛擬相機(jī)的狀態(tài),永遠(yuǎn)在LateUpdate。
通過(guò)虛擬相機(jī)計(jì)算State,根據(jù)UpdateMethod的設(shè)置,在FixedUpdate之后或LateUpdate。
將虛擬相機(jī)的State同步到真實(shí)相機(jī)上,根據(jù)BlendUpdateMethod的設(shè)置,在FixedUpdate之后或LateUpdate。
流程:
??用UpdateMethod和BlendUpdateMethod都為L(zhǎng)ateUpdate時(shí)舉例。
Tips
在更新相機(jī)時(shí),會(huì)通過(guò)UpdateStatus來(lái)保證每個(gè)相機(jī)每幀不會(huì)被多次更新。以免造成性能浪費(fèi)。
VirtualCamera中State計(jì)算流程
??先看一下這個(gè)流水線在Hierarchy里長(zhǎng)什么樣子。
??把CinemachineCore.sShowHiddenObjects設(shè)置為為true,可以看到虛擬相機(jī)下有一個(gè)cm節(jié)點(diǎn)。
??可以看到cm對(duì)象上掛了一個(gè)CinemachinePipeline腳本和對(duì)應(yīng)的兩個(gè)CinemechineComponent。
??CinemachinePipeline并沒(méi)有實(shí)際的邏輯作用,只是起一個(gè)標(biāo)記作用,代表這個(gè)節(jié)點(diǎn)是一個(gè)Pipeline節(jié)點(diǎn)。
??另外兩個(gè)CinemachineComponent就是流水線中用于計(jì)算State的腳本。
State計(jì)算流程:
??State被一環(huán)一環(huán)的傳遞下去,每一步的計(jì)算都依賴(lài)于上一步計(jì)算出的State結(jié)果。
??比如在Aim計(jì)算旋轉(zhuǎn)角度時(shí),就會(huì)依賴(lài)上一步Body計(jì)算出來(lái)的位置,以此位置為基礎(chǔ)來(lái)計(jì)算旋轉(zhuǎn)。
小結(jié)
??這里只是基本的講了一下Cinemachine的工作流程。沒(méi)有深入到每個(gè)類(lèi)型的虛擬相機(jī)。但是對(duì)基本流程有一個(gè)大體的把握后,再去看其他部分應(yīng)該會(huì)輕松一點(diǎn)。
??其次我們也了解到Cinemachine的核心工作流并不復(fù)雜,就那么幾步。代碼的復(fù)雜度主要集中在各種邊界情況和優(yōu)化上。比如:
對(duì)相機(jī)切換過(guò)程中的再次切換,多Timeline情況的處理,使相機(jī)的移動(dòng)總是平滑的。
在Component的基礎(chǔ)上加入Extensions來(lái)增加靈活度。
增加SmartUpdate來(lái)對(duì)相機(jī)的更新時(shí)機(jī)做動(dòng)態(tài)調(diào)整。
等等。
總結(jié)
以上是生活随笔為你收集整理的Cinemachine简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 中国上榜前50名富豪当中,有多少人完全是
- 下一篇: Word 为标题设置段前段后间距设置与异