上記のボックス ソリューション内のボックスは適切なオプションですが、(さまざまなサイズ/形状のオブジェクトが原因で) それが機能しない場合は、 Physics.Raycastまたは Collider.Raycastを使用して何かを達成できる可能性があります。同様の問題があり、任意のポイントがコライダー内に含まれているかどうかをテストする必要がありました (その多くは、異常なぼんやりとした凹型オブジェクトでした)。
基本的なアイデアは、複数の方向からポイントに向かって光線を投射する「釘のベッド」アプローチです。すべてのレイで外側のコライダーをヒットした場合、ポイントがコライダーの内側に含まれていることをかなり確信できます (ただし、完全には確実ではありません)。ここに写真があります:
この図では、青い点が黄色のコライダーの内側にあるかどうかを確認しようとしています。緑色の矢印は成功したレイキャスト (黄色のコライダーにヒット) を表し、ピンクの矢印は失敗した (黄色のコライダーにヒットしない) ことを表します。
これを示すコード スニペットを次に示します。
public static class CollisionUtils {
private static readonly Vector3[] raycastDirections;
// These are the directions that we shoot rays from to check the collider.
static UltrasoundCollisionUtils() {
raycastDirections = new Vector3[5];
raycastDirections[0] = new Vector3(0,1,0);
raycastDirections[1] = new Vector3(0,-1,-0);
raycastDirections[2] = new Vector3(0,0,1);
raycastDirections[3] = new Vector3(-1.41f, 0, -0.5f);
raycastDirections[4] = new Vector3(1.41f, 0, -0.5f);
}
public static bool IsContained (Vector3 targetPoint, Collider collider) {
// A quick check - if the bounds doesn't contain targetPoint, then it definitely can't be contained in the collider
if (!collider.bounds.Contains(targetPoint)) {
return false;
}
// The "100f * direction" is a magic number so that we
// start far enough from the point.
foreach (Vector3 direction in raycastDirections) {
Ray ray = new Ray(targetPoint - 100f * direction, direction);
RaycastHit dummyHit = new RaycastHit();
// dummyHit because collider.Raycast requires a RaycastHit
if (!collider.Raycast(ray, out dummyHit, 100f)) {
return false;
}
}
return true;
}
}
このアルゴリズムを適応させる 1 つの方法は、Collider.Raycast を使用するのではなく、Physics.Raycast を実行することです。光線がコライダー以外のものに当たった場合、ターゲット オブジェクトが完全にコライダーに収まっていないことがわかります。