Menu
CoddyTech

Physics.Raycast

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

レイキャストは、ある点から特定の方向へ見えない線を飛ばし、コライダーに当たったかどうかを報告します。Physics.Raycast(origin, direction, maxDistance)は、maxDistance単位以内の線上にコライダーがある場合はtrueを返し、それ以外の場合はfalseを返します。この車は、車体の先端から前方2単位未満の距離に何かがあるとブレーキをかけます。

public float brakeDistance = 2f;

void Update()
{
    if (Physics.Raycast(transform.position, transform.forward, brakeDistance))
    {
        Debug.Log("Brake!");
    }
}

transform.forwardは車とともに向きを変えるため、レイは常に車体の先端から外側を向きます。一方、Vector3.forwardは常にワールドのz軸に沿った方向を指します。レイは車の中心、つまり車自身のコライダーの内側から始まります。レイは始点が内側にあるコライダーを報告しないため、車自身を検知することはありません。maxDistanceを省略すると、レイは無限に伸びます。その場合、車はマップの反対側にある壁に対してもブレーキをかけてしまいます。

レイが検知するのはコライダーであり、描画されているものではありません。Rendererがあってコライダーがないオブジェクトはレイには見えず、トリガーコライダーはヒットとして扱われます。テスト中は、Debug.DrawRay(transform.position, transform.forward * brakeDistance, Color.red)を使うと、UnityのSceneビューにレイが描画されます。

challenge icon

チャレンジ

中級

店のドアを自動化しましょう。DoorSensorスクリプトは、地面から3.5単位上の出入り口の上にあるSensorに設定されています。Inspectorでdoorとreachに3を設定します。

  • 毎フレーム、Sensorから真下に向けてreach単位の長さのレイを飛ばします。
  • レイが何かに当たっている間はドアが開いています。SetActive(false)でドアを非表示にします。何にも当たっていない間は、ドアを再び表示します。

地面はレイの到達範囲外にあるため、誰かがSensorの下に立つまでドアは閉じたままです。Playを押し、矢印キーでVisitorをその下まで歩かせてから、Checkを押します。

自分で試してみよう

using UnityEngine;

public class DoorSensor : MonoBehaviour
{
    public GameObject door;
    public float reach = 3f;

    void Update()
    {
        // Sensorから下方向に伸びるレイが何かに当たっている間、ドアを開けます。
    }
}
quiz icon腕試し

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

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