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ビューにレイが描画されます。
チャレンジ
中級店のドアを自動化しましょう。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から下方向に伸びるレイが何かに当たっている間、ドアを開けます。
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。