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ビューにレイが描画されます。
チャレンジ
中級センサーの下に人が立っている間、お店のドアが開くようにしましょう。
Update()でPhysics.Raycast(transform.position, Vector3.down, reach)をテストします。これは真下に向かう、reach単位の長さの光線で、地面の上で止まります。- 条件が真の場合は
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プレイグラウンド