Menu
CoddyTech

RaycastHit

CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 36/71。

Physics.Raycastは、何に当たったかも教えてくれます。方向の後にout RaycastHit hitを追加します。このメソッドがtrueを返すと、詳細情報がhitに格納されます。outは、指定した変数を通じてC#のメソッドが追加の値を返す方法です。この距離計は、Spaceキーを押すと、何を指しているかと、それがどれくらい離れているかをログに出力します。

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, 50f))
        {
            Debug.Log(hit.collider.name + " is " + hit.distance + " units away");
        }
    }
}

正面が12単位先にある壁に向けると、Wall is 12 units awayとログに出力されます。ほかのフィールドについて説明します。hit.pointはレイが表面に触れたワールド座標上の位置、hit.normalはその位置で表面が向いている方向(平らな地面では(0, 1, 0))、hit.transformは当たったオブジェクトのTransformです。hit.collider.gameObjectを使えば、タグなど、そのオブジェクトに関するほかの情報にもアクセスできます。

hitを読むのはifの中だけにしてください。レイが何にも当たらないと、Raycastはfalseを返し、hitには有用な情報が入りません。つまり、colliderはnullになります。

challenge icon

チャレンジ

中級

銃にレーザーサイトを付けましょう。レーザーが当たる場所に赤い点を表示します。

  1. Update()内で、Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range)を呼び出します。
  2. ヒットしたら、dot.gameObject.SetActive(true);を呼び出し、dot.position = hit.point;を設定します。
  3. ヒットしなかったら、dot.gameObject.SetActive(false);を呼び出します。

「プレイ」を押して銃を回すと、点が壁や木箱の上を滑るように動きます。その後、「確認」を押します。

自分で試してみよう

using UnityEngine;

public class LaserSight : MonoBehaviour
{
    public Transform dot;
    public float range = 15f;

    void Update()
    {
        // レーザーが表面に当たる位置にdotを配置し、何にも当たらないときは非表示にする。
    }
}

物理演算とゲームプレイのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド