この記事でのバージョン
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もあります。