Unity之CharacterController2D學習筆記(1)——基礎使用


在很多游戲類型中,玩家角色對物理行為的處理往往和場景中其它物體的行為有比較大的區別。比如角色可能會以90多公里的時速狂奔,同時一次跳躍能跳10多米高,與此同時卻幾乎不會有任何慣性。同時角色在正常情況下當頭部碰到障礙物的時候,應該只是會被阻擋前進,而不應該直接仰面摔倒。這些特殊的需求注定不應該以普通的碰撞區+剛體的形式來實現,所以unity為我們准備了名叫“角色控制器”(CharacterController)的組件。然而到目前為止(5.5unity中只為3D物理提供了這個組件,針對2D游戲則需要我們自己實現一套類似的機制。

 

基本原理就是不用自帶的那些物理判斷,而使用射線檢測等方法來判斷前進方向上是否有障礙物等並修改移動的方向和距離,從而達到所需的效果。起初博主自己實現了一個有基礎功能的版本,后來在github上發現了一個別人實現好的功能更全面的版本,所以在這里分享出來。


地址:https://github.com/prime31/CharacterController2D


博主使用這個控制器的主要目的是為了做一款平台動作類游戲,因此也會着重說一些制作使用途中遇到的問題以及解決方法。


先看一下組件掛載在GameObject上之后可以設定的屬性:



可以看到這里和CharacterController一樣也有Skin Width這個選項,這個選項會影響角色控制器檢測碰撞時的射線,具體的實際影響會在之后代碼的部分再詳細說。

然后接下來是設定三種射線檢測時的層級:不可穿過的牆壁、地面;觸發事件而不會影響物理控制的觸發區和可以單向穿過的平台。

再往下是上坡角度的限制、跳躍閾值以及在坡道上運動時由於坡度對速度造成的影響的曲線。跳躍閾值這里博主在自己的項目里並沒有使用到,不過在作者的demo里面是有用到的。

最后就是水平方向和垂直方向分別的射線數量。射線數量越多,相對就會檢測的越精確,不過也需要花費更多的計算資源。


需要注意的是,這個角色控制器會要求掛載的對象上同時也具備剛體(Rigidbody2D)及矩形碰撞區(BoxCollider2D)兩個組件,其中剛體是觸發碰撞必須的組件,而矩形碰撞區雖然必須掛載,但並不意味着就一定要使用它,可以在代碼中隨時進行切換,只不過如果在角色已經落地了的情況下,直接切換到一個更大的碰撞區的話,是有可能會導致角色卡住的(碰撞區底部陷入地面)



基本上最基礎的使用就是調用move(Vector3 deltaMovement)這個方法。這個方法的意義是將控制器向deltaMovement向量移動,若其中有任何被標記過的不可穿過的碰撞區則都會阻礙這次移動。



有一個問題需要注意,就是移動的時候,若需要獲取到是否在某個方向(上下左右)接觸到了障礙物的話,一定要使傳入的deltaMovement向量中包含着向障礙物方向移動的分量,否則將會導致跳過該方向的碰撞檢測從而無法正確得知你所需要的信息(比如明明就在地面上,isGrounded屬性卻一直是false的話,很有可能是因為你的移動分量里沒有向地面的分量,而碰撞區本身又有一點點傾斜,導致出現了檢測錯誤)


下一篇將會更詳細的說一下代碼的部分。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM