【Unity】RaycastHitについて

UnityにおけるRaycastHitは、Rayがオブジェクトに当たった際の詳細な情報を提供する構造体です。Physics.RaycastメソッドなどでRayが何かに衝突したときに、この構造体を使って、どのオブジェクトに当たったのかや、当たった位置などの詳細情報を取得できます。

RaycastHitの基本構造

RaycastHitは、Rayがオブジェクトに衝突した際に得られる情報を保持するためのデータ構造です。代表的なフィールドやプロパティには、次のようなものがあります。

主なフィールド・プロパティ

  • collider: Rayが当たったオブジェクトのコライダー(Colliderオブジェクト)を取得します。これを使って、どのオブジェクトに当たったのかを確認できます。
  Collider hitCollider = hitInfo.collider;
  Debug.Log("Hit object: " + hitCollider.name);
  • point: Rayがオブジェクトに当たった「衝突点」のワールド座標を返します。これを使って、衝突位置を確認したり、エフェクトを発生させる場所を特定したりします。
  Vector3 hitPoint = hitInfo.point;
  • normal: Rayが当たったオブジェクトの表面の法線ベクトル(衝突点での表面の向き)を返します。これを使って、例えば衝突後の反射方向などを計算できます。
  Vector3 hitNormal = hitInfo.normal;
  • distance: Rayの発射点から衝突点までの距離を返します。Rayが発射されてからどれくらいの距離でオブジェクトに衝突したかを知るために使います。
  float hitDistance = hitInfo.distance;
  • transform: Rayが当たったオブジェクトのTransformを取得します。これにより、オブジェクトの位置、回転、スケールにアクセスできます。
  Transform hitTransform = hitInfo.transform;
  • rigidbody: Rayが当たったオブジェクトにRigidbodyがアタッチされている場合、そのRigidbodyを取得できます。これを使って、衝突によってオブジェクトを動かしたりすることができます。
  Rigidbody hitRigidbody = hitInfo.rigidbody;

使い方の例

RaycastHitは、Physics.Raycastメソッドの引数として使われ、Rayが何かに当たった場合、その情報がRaycastHitオブジェクトに格納されます。

以下のコードは、カメラからRayを発射して、何かに当たった場合、そのオブジェクトの名前や当たった位置を表示する例です。

void Update()
{
    Ray ray = new Ray(Camera.main.transform.position, Camera.main.transform.forward);
    RaycastHit hitInfo;

    // Rayがオブジェクトに当たったかどうかをチェック
    if (Physics.Raycast(ray, out hitInfo))
    {
        // 当たったオブジェクトの名前を取得
        Debug.Log("Hit object: " + hitInfo.collider.name);

        // 当たった位置を取得
        Debug.Log("Hit point: " + hitInfo.point);

        // 当たった表面の法線ベクトルを取得
        Debug.Log("Surface normal: " + hitInfo.normal);
    }
}

応用例

RaycastHitを使うと、次のような処理を実現できます。

  • 衝突エフェクト: 衝突点でエフェクト(例えば、爆発やスパーク)を発生させる。
  • 物理演算: 衝突したオブジェクトに力を加えたり、オブジェクトを動かす。
  • 視線の衝突判定: カメラからプレイヤーがどのオブジェクトを見ているかを確認する。

まとめ

RaycastHitは、Rayがオブジェクトに衝突した際の詳細な情報を提供する構造体で、衝突判定や物理演算など様々な用途に使えます。Rayの衝突判定と組み合わせることで、ゲームにおけるインタラクティブな動作を実現するための重要な要素となります。

Unity

Posted by hidepon