Unity3D 遊戲中的技能碰撞檢測

2021-09-10 21:45:41 字數 2238 閱讀 8991

在遊戲戰鬥中,我們會用到各種各樣的碰撞檢測,來判斷是否打中了目標

比如扇形檢測/圓形檢測

還有矩形檢測,王者榮耀裡后羿的大招就是乙個很長的矩形碰撞體

這些在unity3d引擎中其實都封裝好了一些collider元件去檢測碰撞,但是我最近寫幀同步演算法的時候,發現u3d中的碰撞演算法執行順序不可控,會導致不同步的現象,所以就只好苦逼的自己寫碰撞檢測演算法了。

我們遊戲是乙個3d動作類遊戲,大概的碰撞可以分為幾類

圓柱體(把人/怪物的碰撞設定位乙個圓柱體,u3d裡是膠囊體,是為了解決一些邊緣精度問題,但是我們遊戲裡的話圓柱就夠用了)

球體立方體

需要檢測的碰撞有

1.檢測圓柱體跟球體的碰撞

2.立方體跟圓柱體的碰撞

具體實現:

1.球體跟圓柱體碰撞檢測

1     /// 2     /// 檢測球體跟圓柱體碰撞

3 ///

4 /// 球體x

5 /// 球體y

6 /// 球體z

7 /// 球體半徑

8 /// 圓柱體x

9 /// 圓柱體y

10 /// 圓柱體z

11 /// 圓柱半徑

12 /// 圓柱體高度

13 public static bool checkcircleandcylindercollider(float x1, float y1, float z1, float r1,

14 float x2, float y2, float z2, float r2, float h2)

15

1.檢測兩個圓有沒有相交

2.檢測y軸的距離是否小於球半徑+圓柱體高度的一半

這裡是把球體也當成了圓柱體進行檢測,好處就是:效率高。 缺點是:不精確,沒有考慮x,z軸的旋轉

但由於我們遊戲中圓柱體不會有x,z軸的旋轉,所以這樣的做法是最高效的

精確性問題:把圓柱體變成膠囊體,兩端用兩個球體來計算檢測,這樣會更精確,同時效能也會降低

2.立方體跟圓柱體的碰撞

這裡先把問題簡化成矩形跟圓形的碰撞檢測

計算方法是先找到矩形上離圓形最短距離u,然後再比較u是否小於圓形的半徑r

1. 首先利用絕對值把 p - c 轉移到第一象限,下圖顯示不同象限的圓心也能對映至第一象限,這不影響相交測試的結果:

2. 然後,把 v 減去 h,負數的分量設定為0,就得到圓心與矩形最短距離的向量 u。下圖展示了4種情況,紅色的u是結果。

最後要比較u和r的長度,若距離少於r,則兩者相交。可以只求u的長度平方是否小於r的平方

對於aabb包圍盒,這樣就已經可以檢測碰撞了,但是如果矩形是旋轉的obb包圍盒呢?

我這裡是實現了乙個obb的包圍盒類,記錄了座標,角度,碰撞檢測的時候先把圓的角度旋轉到obb的座標系裡

利用旋轉公式:

x2 = x * mathf.cos(rad) - z * mathf.sin(rad);

z2= x * mathf.sin(rad) + z * mathf.cos(rad);

然後再用那篇文章裡說的方式計算矩形跟圓是否相交

最後再通過兩者 y軸的距離 < (圓柱體高度+立方體的高度)/2 ,如果小於則相交

這種方法的優勢:效率高,而且精確

缺點是這個3d的obb只能沿y軸旋轉,不過也夠用了 

如果像王者榮耀型別的遊戲,感覺不需要擴充套件到3d,2d檢測應該就夠用了

posted @

2017-04-16 15:03

李嘉的部落格 閱讀(

...)

編輯收藏

Unity3D 碰撞測試

碰撞測試這個再遊戲的開發中是很有必要的,當敵人的攻擊的時候,發生碰撞這時候就會造成一定的傷害,因此我們需要根據受到的傷害對使用者的生命值進行控制,因此碰撞的測試是 我們在遊戲的開發過程中需要的一種比較重要的資料。在unity中的碰撞測試有兩種,一種是碰撞,一種是觸發!一種屬於物理碰撞,一種屬於非物理...

unity3d碰撞檢測

具體的一些,可以看 unity3d的 manual refrernce的東西,有幾個 在後面可以參考 幾個型別碰撞器 1.靜態碰撞器 就是只有碰撞器,但沒有剛體的 2.剛體碰撞器 帶rigidbody的碰撞器,這個是最基本的碰撞器 3.運動學剛體碰撞器 帶rigidbody,而且rigidbody的...

Unity3d 碰撞檢測

unity3d 主要由trigger和collison 兩種碰撞檢測 1 檢測trigger 雙方都有collider。雙方至少有乙個rigidbody 任意一方都可以 有乙個trigger 任意一方都可以 若只有乙個rigidbody,則碰撞時,該rigidbody一定要是運動的。碰撞後發出的on...