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