Unity3d 人物跳躍後落地懸空問題

2021-10-03 18:24:25 字數 2570 閱讀 3236

人物在檢測到跳躍事件後,給乙個初始速度v

0v_0

v0​,根據重力加速度g

gg和時間差t

tt,計算出當前人物的速度為 v=v

0−g∗

tv= v_0 -g * t

v=v0​−

g∗t。在當前呼叫的△

t\******** t

△t時間內,位移為△y=

v∗△t

\******** y= v*\******** t

△y=v∗△

t。檢測是否落地採用了physics.capsulecast函式,判斷人物是否與地面足夠近,然後重新設定人物的座標(根據hit.distance計算出的與地面的距離)。

但是,不知為何人物在落地時,總會高出地面0.25,後續跳躍就總是以此為平面了。

檢測碰撞的**如下:

// 判斷是否落地

void

groundcheck()

}}}}

vector3 getcapsulebottompoint()

vector3 getcapsuletoppoint()

通過一番排查,問題主要出在physics.capsulecast部分,它在距離地面0.25f+hit.distance的時候就認為掃瞄到了碰撞體。此時,transform.position.y總在0.25附近,最終導致懸空。

至於出現這個問題的原因,還尚未清楚。

5/17

距離記錄這個問題,已有一段時日,後續也並未找出碰撞檢測的位置和座標不一致的具體原因,最終採用了另一種方法來解決落地問題。

涉及到y軸的變化(跳躍行為,地形變化)時,必然要每幀檢測與地面的距離以確保人物貼在地上,在上述詭異的情況下,我採用了charactercontroller控制項提供的isgrounded成員變數來作為是否落地的直接依據。同時採用charactercontroller控制項提供的move函式來控制人物的移動,也能有效保證人物不會1)穿過帶碰撞體的物體,2)穿過地面等情況。

因此,最終跳躍的整套解決方法流程如下:

人物正在正常的移動,檢測到玩家按下空格鍵(跳躍鍵)。

人物的動畫狀態機切換到跳躍動畫。人物產生y軸方向上的初始速度v

0v_0

v0​。

在每幀中更新人物的高度(也就是v0∗

t−g∗

t2/2

v_0*t-g*t^2/2

v0​∗t−

g∗t2

/2),同時檢測是否與地面碰撞。

若檢測到碰撞,則將動畫狀態機切換為落地動畫等。但不改變垂直方向速度,讓它繼續落地。

若檢測到isgrounded成員變數標誌為false,那麼增加垂直方向上的速度vt+

1=vt

+g∗△

tv_ = v_t + g*\******** t

vt+1​=

vt​+

g∗△t

和位移。

若檢測到isgrounded成員變數標誌為true,那麼將垂直方向的速度設定為0,不再產生垂直方向上的位移。

重複步驟5和6,即使遇到地面凹陷情況,也可以準確的自由落體至掉進底部,效果還算可以。

注意點

在上述的步驟6中,當檢測到isgroundedtrue時,由於某些神秘原因,會導致人物稍稍上移(大約在0.00000001左右),下一幀在update函式中檢測isgrounded時又會重新變成false,最終導致該部分反覆在往下掉和向上彈的過程中反覆波動。

解決這個問題的方式,我採用了判斷是否懸空有兩個條件:

就是isgrounded標誌為false另外,就是用一條射線向下檢測,如果檢測到hitdistance大於0.01就認為是已經懸空,開始製造垂直方向的加速度。

綜合上述,就可以比較完美的實現跳跳樂了,甚至奇形怪狀的地形,石頭等,也可以安然落在上面。

示意**如下所示:

void

update()

public

void

jumpstart()

float

getverticalheight()

"unlanded: ", transform.position.y));

return m_verticalspeed * time.deltatime;

}else

", transform.position.y));

m_verticalspeed =0;

return0;

}}bool

islanded()

Unity3D開發(九) Unity3d流光效果

遊戲開 壇 hello game 遊戲開發群 201276069 之前曾經注意過material 中紋理的屬性都有 tiling 和offset 但沒有深究過其用途,今天才知道竟然可以利用 offset做uv 動畫,從而完成各種有趣的動畫,比如流光效果!流過效果即通常一條高光光在物體上劃過,模擬高光...

原 unity3d 滑鼠點選 控制人物行走

實現思路 滑鼠點選,產生目標點,計算角色和目標點的夾角,旋轉角色朝向目標點,然後移動角色。看到很多人瀏覽了這篇博文 有人建議寫點注釋,我就簡單注釋一下。1 void update 27 if flagmove 813 else 1417 18 19void raycontrol 2037 print...

Unity3d時鐘指令碼

var tu1 texture2d var time1 float 0 function fixedupdate function ongui function gettime time float string var lasttime string var hour mathf.floortoi...