
このようにCapsule Colliderに重なってる2つのColliderを取得したいときは、Physics.OverlapCapsule
を使うとよい。このメソッドにCapsule Colliderの位置と大きさを与えると、重なっているColliderがすべて返る。RigidbodyをKinematic TriggerにしてOnTriggerEnter
をハンドルして取得することもできるが、こちらのほうが手軽である。
Physics.OverlapCapsule
の必須の引数のみのシグネチャを以下に示す。
point0
とpoint1
にCapsuleの上下の半球の中心をradius
に半径を指定する。
CapsuleColliderの位置と大きさは、中心の座標(Center)と高さ(Height)と半径(Radius)で与えられる。Physics.OverlapCapsule
の引数の仕様とは異なっているので変換の必要がある。

CapsuleColliderの位置と大きさはローカル座標で与えられるので、変換する前にグローバル座標に変換する必要がある。この記事のプログラムは大きさを変換していないため、GameObjectの大きさが1でないと正しく動かない。
グローバル座標に変換する手順を以下に示す。
まず、GameObjectのTransformのTransformVector
を使って大きさをグローバル座標に変換する。半径をxに高さをyに与えて変換すると、グローバル座標における半径と高さが求められる。次にTransformPoint
を使って、中心の座標をグローバル座標に変換する。
こうして求めた大きさと位置から、以下のようにPhysics.OverlapCapsule
の引数を計算して実行する。
当然のことながら、返ってくるColliderにはCapsuleColliderも含まれることに注意してほしい。避けたければ、あらかじめCapsuleColliderを無効化しておくとよい。
Physics.OverlapCapsule
を用いると、対象のCapsuleCollderよりもサイズを小さくして、触れているだけのColliderを除外するとか、サイズを大きくして接触しそうなColliderを取得するといったことが自在に行える。
ところで、Physics.OverlapCapsule
は呼ぶたびに配列をアロケートして結果を返すので、毎フレーム呼ぶ場合には大量にゴミが出てしまう。その場合には、Physics.OverlapCapsuleNonAlloc
で事前にアロケートした配列で結果を受け取る。使用例を以下に示す。
重なりを5つまで検出する場合は、5要素のColliderの配列をUpdateの外で作っておく。それをPhysics.OverlapCapsuleNonAlloc
に渡して実行すると、_result
に検出したColliderが格納されて、その数が返値として返る。