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になります。
チャレンジ
中級銃にレーザーサイトを付けましょう。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を配置し、何にも当たらない場合は非表示にします。
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。