以下の内容はhttps://kan-kikuchi.hatenablog.com/entry/Rigidbody_SweepTestより取得しました。


Rigidbodyを使って任意の形(=メッシュ)で衝突するか通過するかをチェックする SweepTest【Unity】




この記事でのバージョン
Unity 2022.3.21f1


はじめに

UnityではRaycastを使って、

指定の位置や方向に何か衝突するオブジェクトがあるかをチェックする事が出来ます。



しかし、Raycastは点や球などの決められた形でしか判定が出来ません。


と言う事で今回は、任意の形で衝突するか通過するかをチェックする方法の紹介です!

イメージとしては以下のような感じ。


なお、記事中では以下のアセットを使っています。

Mahjong Complete Set - Unity Asset Store


Rigidbody.SweepTest

今回使うのはRigidbody.SweepTestという

Rigidbodyが指定の方向に移動した時にコライダーと衝突するかを検知するメソッドです。



具体的な使い方は以下のような感じ。

_rigidbody = GetComponent<Rigidbody>();
        
//前方(Vector3.forward)に障害物があるかどうかチェック
if(_rigidbody.SweepTest(Vector3.forward, out var hit)) {
  Debug.Log($"通らない");
}
else {
  Debug.Log($"通る");
}


前方に何も無く、そのまま通過出来ればfalseが返ってきますし、


何かのコライダーに衝突すればtrueが返ってきます。


Rigidbodyが付いていればコライダーはBoxでもMeshでも何でも大丈夫ですが、

コライダーはRigidbodyと同じオブジェクトに付いてる必要があるようです。

(物理挙動的には子に付いていても問題ないが、SweepTestでは子のコライダーは使われない)


なお、Raycastを使った時と同様にhitで衝突したコライダー等の情報が得られますし、

チェックする距離トリガーと衝突するかという引数もあります。

//前方に障害物があるかどうかチェック
if(_rigidbody.SweepTest(Vector3.forward, out var hit, 
  maxDistance:1.0f, //チェックする距離(デフォルトでは無制限)
  queryTriggerInteraction:QueryTriggerInteraction.Ignore //トリガーの衝突しない(デフォルトではプロジェクト設定に依存)
)) {
Debug.Log($"通らない : 衝突したオブジェクト : {hit.collider.gameObject.name}");
}


また、衝突したコライダー全てを取得するSweepTestAllもあります。








以上の内容はhttps://kan-kikuchi.hatenablog.com/entry/Rigidbody_SweepTestより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14