Physics APIを用いて、物理エンジンに基づく詳細な当たり判定を実装することができます。UnityのPhysics
クラスには、物理エンジン関連の機能が多く提供されています。
Raycast
は、特定の方向に向かってRay(直線)を飛ばし、その線上でオブジェクトに当たったかどうかを判定します。非常に便利で、多くのシーンで使われます(射撃、視界判定、レーザー、クリック判定など)。
基本的なRaycast
のシグネチャは以下です。
bool hit = Physics.Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance);
Vector3
)。Vector3
)。RaycastHit
構造体。カメラからRayを飛ばして、オブジェクトに当たったかどうかを判定するコードは以下です。
void Update()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // カメラからRayを発射
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100f)) // 100ユニット先までRayを飛ばす
{
Debug.Log("Hit object: " + hit.collider.gameObject.name); // 衝突したオブジェクト名
Debug.Log("Hit point: " + hit.point); // 衝突位置
Debug.Log("Hit normal: " + hit.normal); // 衝突面の法線
}
}
Physics.Raycast
は、単一のオブジェクトとの衝突を判定する場合に使いますが、複数のオブジェクトとの衝突を取得するには、Physics.RaycastAll
を使います。
RaycastHit[] hits = Physics.RaycastAll(ray, 100f);
foreach (RaycastHit hit in hits)
{
Debug.Log("Hit object: " + hit.collider.gameObject.name);
}
// 球の範囲でのRaycast
if (Physics.SphereCast(transform.position, radius, transform.forward, out hit, maxDistance))
{
Debug.Log("Hit object with SphereCast: " + hit.collider.gameObject.name);
}
RaycastHit
構造体を使用することで、Rayが当たったオブジェクトの詳細情報を取得できます。
Collider
。Vector3
)。Vector3
)。float
型)。Rayは通常、直線を使いますが、Unityでは異なる形状のRaycastも提供されています。
BoxCast: ボックスの形をしたRayで、オブジェクトが衝突したかどうかを判定します。
if (Physics.BoxCast(transform.position, boxSize, transform.forward, out hit, transform.rotation, maxDistance))
{
Debug.Log("Hit object with BoxCast: " + hit.collider.gameObject.name);
}
SphereCast: 球の形をしたRayで、広範囲に対する判定が可能です。小さなオブジェクトや遠くの物体に対する判定に有効です。
if (Physics.SphereCast(transform.position, radius, transform.forward, out hit, maxDistance))
{
Debug.Log("Hit object with SphereCast: " + hit.collider.gameObject.name);
}
CapsuleCast: カプセル形のRayで、衝突判定を行います。キャラクターの体当たりやぶつかり具合のシミュレーションなどに適しています。
if (Physics.CapsuleCast(point1, point2, radius, transform.forward, out hit, maxDistance))
{
Debug.Log("Hit object with CapsuleCast: " + hit.collider.gameObject.name);
}