人物在檢測到跳躍事件後,給乙個初始速度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中,當檢測到isgrounded
為true
時,由於某些神秘原因,會導致人物稍稍上移(大約在0.00000001左右),下一幀在update
函式中檢測isgrounded
時又會重新變成false
,最終導致該部分反覆在往下掉和向上彈的過程中反覆波動。
解決這個問題的方式,我採用了判斷是否懸空有兩個條件:
就是isgrounded
標誌為false
另外,就是用一條射線向下檢測,如果檢測到hit
且distance
大於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...