Menu
CoddyTech

RaycastHit

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

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

チャレンジ

中級

銃にレーザーサイトを付けましょう。LaserSightスクリプトはGunに配置し、Inspectorで赤いdot(Transform)とrangeを15に設定します。左右の矢印キーで銃を回転させます。

  • 毎フレーム、銃の前方に向けて、rangeの距離だけレイを飛ばします。
  • 何かに当たったら、ドットを表示し、レイが表面に触れた位置に正確に配置します。
  • 何にも当たらなかったら、SetActive(false)でドットを非表示にします。

DotはIgnore Raycastレイヤーにあるため、レイはドット自体を通り抜けます。Playを押し、壁、木箱、樽にレーザーを向けてから、Checkを押します。

自分で試してみよう

using UnityEngine;

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

    void Update()
    {
        // レーザーが表面に当たる位置にdotを配置し、何にも当たらない場合は非表示にします。
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

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