您好,登錄后才能下訂單哦!
最近在寫(xiě)關(guān)于相機(jī)跟隨的邏輯,其實(shí)最早接觸相機(jī)跟隨是在Unity官網(wǎng)的一個(gè)叫Roll-a-ball tutorial上,其中簡(jiǎn)單的涉及了關(guān)于相機(jī)如何跟隨物體的移動(dòng)而移動(dòng),如下代碼:
簡(jiǎn)單相機(jī)移動(dòng)
可以很容易的理解上述的代碼: 在初始化時(shí)計(jì)算與對(duì)應(yīng)物體的向量差值,然后在LateUpdate中對(duì)相機(jī)位置進(jìn)行及時(shí)更新,至于為什么要放在LateUpdate,因?yàn)長(zhǎng)ateUpdate是等所有腳本的Update跑完之后
在更新自己的邏輯,這樣相機(jī)得到物體的位置往往是最新的 。具體可以看 Unity關(guān)于腳本生命周期 中有提到。
上述的代碼 , 相機(jī)是實(shí)時(shí)跟蹤的, 其實(shí)相機(jī)的跟蹤可以變的跟平滑一點(diǎn),可以利用Unity中的Mathf.Lerp,在每一幀做一個(gè)線性的差值,這樣的話可以使相機(jī)跟隨變的更平滑一點(diǎn),如下優(yōu)化的代碼:
平滑的跟蹤
上述代碼能滿足大多數(shù)情況,但是如果一個(gè)場(chǎng)景里有多個(gè)焦點(diǎn)呢? 比如現(xiàn)在要滿足的業(yè)務(wù)條件是:
當(dāng)鼠標(biāo)對(duì)屏幕進(jìn)行拖拽時(shí),需要移動(dòng)相機(jī)
當(dāng)有多個(gè)焦點(diǎn)時(shí),如何更好的切換
我們先來(lái)實(shí)現(xiàn)第一個(gè)需求,先講講現(xiàn)在具備哪些條件:
Input.GetMouseButtonDown(0) : 這個(gè)表示在某一幀按下鼠標(biāo)左鍵,會(huì)返回true,如果你一直按著不放(返回的是false),直到你松開(kāi)再按下(才會(huì)再次返回true) 可以參考文檔
Input.GetMouseButton(0): 這個(gè)表示當(dāng)前是鼠標(biāo)左鍵按下,會(huì)返回true 可以參考文檔
通過(guò)上述接口,我們可以實(shí)現(xiàn)拖拽了,思路的話就不細(xì)說(shuō),看代碼就行:
拖拽代碼
這邊提一下在DragCamera函數(shù)中如果OriginDragPos不及時(shí)更新,屏幕在鼠標(biāo)移動(dòng)時(shí)會(huì)一直移動(dòng),因?yàn)樵谟?jì)算是產(chǎn)生的move向量一直有值,所以會(huì)不斷偏移,這邊看需求吧。
上述的代碼已經(jīng)可以實(shí)現(xiàn)相機(jī)的拖拽了,但是如果你的屏幕上有UI結(jié)構(gòu),按下UI結(jié)構(gòu)時(shí),點(diǎn)擊UI結(jié)構(gòu) ,其實(shí)也會(huì)調(diào)用 Input.GetMouseButtonDown(0),就會(huì)調(diào)用拖拽函數(shù),但是
往往這種情況下,是不需要將m_bIsDrag設(shè)為true,所以如何優(yōu)化屏蔽呢? 看如下代碼:
屏蔽UI
這邊要提一下關(guān)于Unity5.X中GUI的事件系統(tǒng) 確定事件產(chǎn)生到接收 流程是 輸入模塊產(chǎn)生事件數(shù)據(jù) PointerEventData ,通過(guò)投影模塊(射線)確定具體UI , 最終到具體UI來(lái)接收數(shù)據(jù),
由于這不是本篇的重點(diǎn),可以看一下 關(guān)于事件系統(tǒng)的博文 我們這里模仿了前兩步驟,確定當(dāng)前鼠標(biāo)輸入的點(diǎn)是否UI有就直接return.
關(guān)于焦點(diǎn)確定,其實(shí)算是優(yōu)化項(xiàng)吧 ,我這邊采樣的是委托/事件方式來(lái)發(fā)送對(duì)應(yīng)的Tranform,當(dāng)然也可以直接接口。
相機(jī)移動(dòng)的例子
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。