初學Unity的第一個坑 CharacterController的Move和SimpleMove

這幾天一直加班,回來也只是看看視頻,都沒心情整理資料了。。

=============================================================

好,先把第一個坑寫上來

一開始邊看視頻邊照著寫代碼,結果沒注意看,在角色移動的代碼上把SimpleMove寫成了Move,爬坡以后由于視角問題并沒有發現角色懸空了,只是看到角色可以穿透一些比較矮的圍欄。 (花了2個小時在網上找資料,自己寫重力代碼。。。此處省略500字)后來才發現是沒有重力效果,再反復查看視頻才發現代碼寫錯了。

那么SimpleMove和Move到底有什么區別呢?

先看看官方解釋

SimpleMove

Moves the character with speed.

Velocity along the y-axis is ignored. Speed is in meters/s. Gravity is automatically applied. Returns if the character is grounded. It is recommended that you make only one call to Move or SimpleMove per frame.

=============================================================

Move

A more complex move function taking absolute movement deltas.

Attempts to move the controller by motion, the motion will only be constrained by collisions. It will slide along colliders. CollisionFlags is the summary of collisions that occurred during the Move. This function does not apply any gravity.

看不懂沒關系,我們有Google翻譯?。?/p>

SimpleMove

以速度移動角色。

沿y軸的速度被忽略。 速度以米/秒為單位。 重力是自動應用的。 如果角色接地,則返回。 建議您只對每幀的Move或SimpleMove進行一次調用。

==============================================================

Move

一個更復雜的移動功能,絕對移動三角洲。

試圖通過運動來移動控制器,運動只會受到碰撞的限制。 它會沿著對撞機滑動。 CollisionFlags是移動過程中發生的碰撞概要。 此功能不適用于任何重力。

直接看字面意思可以得到:

SimpleMove

1、SimpleMove不受Y軸速度影響,只有X軸和Z軸方向的有效,且自帶重力效果。

2、SimpleMove有返回值(BOOL類型),角色接觸地面則返回true,否則返回false。

Move

1、Move可以理解為對一個角色的絕對控制,意思就是在XYZ軸上都不給值的時候,角色不管在什么位置都會靜止不動,唯一會影響移動的就是各種障礙物的剛體碰撞,他會沿著剛體滑動,所以說這個是沒有自帶重力效果的。

2、Move方法有返回值(CollisionFlags對象),可以返回一些角色與任何物體碰撞的信息。


看到這里,這個坑應該算是填上啦!

所以說各位跟我一樣的初學的朋友們,看視頻要仔細咯!!

=============================================================

另外在填坑的過程中產生了一些疑問也記錄一下吧~

上面有提到我自己查資料,自己寫重力代碼,發現一個問題,網上很多兄弟都是用以角色為起點,放出一條垂直向下的,突出角色的,突出長度為0.1的射線(這里也把我坑慘了,射線起點是在角色的中心,也就是一個半徑為1的球形角色,要發出一條突出角色且突出長度為0.1的射線,則射線的長度應該是1.1),那么問題來了,射線是垂直向下的,角色又是一個球體,那么在不規則的地形中,球在爬坡時,射線會射不到地面



但是角色是可以在這個地形上停留的,也就是說,角色應該是已經落地了

但是由于射線并沒有被擋住,那么就會一直在執行向下的降落的代碼,由于我寫的重力代碼是有重力加速度的,也就是下落速度是變化的,那么這樣就會造成下落速度不清零。

我想出來的解決辦法是

1、如果能獲取到球與地面碰撞的相對于球的位置,那么用球中心向該碰撞點的方向發射一條射線x。

2、獲取到角色的爬坡角度,也就是可以在多大的角度上停留。

3、創建一條垂直向下的射線y,計算射線x和射線y的夾角,大于爬坡角度的話角色還會繼續下落,反之則角色可以停留在該地形上,則判斷已經落地了。

這是我想的解決辦法,但是水平不夠,暫時還是沒辦法寫出代碼來。


===============================================================

以上就是我遇到的問題啦,如果有小伙伴們發現上面有任何錯誤,請您給我留個言,我會盡快修正,免得誤人子弟,謝謝。

關于最后的問題,有大神懂的也請幫幫忙,發個代碼上來,大家互相學習??!謝謝啦!?。?/p>

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容