Menu
CoddyTech

Physics.Raycast

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

レイキャストは、ある点から特定の方向へ不可視の線を飛ばし、コライダーに当たったかどうかを報告します。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

チャレンジ

中級

センサーの下に人が立っている間、お店のドアが開くようにしましょう。

  1. Update()でPhysics.Raycast(transform.position, Vector3.down, reach)をテストします。これは真下に向かう、reach単位の長さの光線で、地面の上で止まります。
  2. 条件が真の場合はdoor.SetActive(false);を呼び出し、elseではdoor.SetActive(true);を呼び出します。

「プレイ」を押し、Visitorをセンサーの下まで歩かせます。ドアが開き、その後ろで閉まります。それから「確認」を押します。

自分で試してみよう

using UnityEngine;

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

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

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

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