Unity_Lesson

Physics APIを利用した当たり判定

Physics APIを用いて、物理エンジンに基づく詳細な当たり判定を実装することができます。UnityのPhysicsクラスには、物理エンジン関連の機能が多く提供されています。



Physics.Raycast

Raycastは、特定の方向に向かってRay(直線)を飛ばし、その線上でオブジェクトに当たったかどうかを判定します。非常に便利で、多くのシーンで使われます(射撃、視界判定、レーザー、クリック判定など)。

基本的なRaycastのシグネチャは以下です。

bool hit = Physics.Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance);



Raycastの例

カメラから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関連メソッド

// 球の範囲でのRaycast
if (Physics.SphereCast(transform.position, radius, transform.forward, out hit, maxDistance)) 
{
    Debug.Log("Hit object with SphereCast: " + hit.collider.gameObject.name);
}

取得できる情報: RaycastHit 構造体

RaycastHit構造体を使用することで、Rayが当たったオブジェクトの詳細情報を取得できます。




3. Rayの形状と取得できる情報

Rayは通常、直線を使いますが、Unityでは異なる形状のRaycastも提供されています。