RaycastHit
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 36/71。
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になります。
チャレンジ
中級銃にレーザーサイトを付けましょう。レーザーが当たる場所に赤い点を表示します。
Update()内で、Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range)を呼び出します。- ヒットしたら、
dot.gameObject.SetActive(true);を呼び出し、dot.position = hit.point;を設定します。 - ヒットしなかったら、
dot.gameObject.SetActive(false);を呼び出します。
「プレイ」を押して銃を回すと、点が壁や木箱の上を滑るように動きます。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class LaserSight : MonoBehaviour
{
public Transform dot;
public float range = 15f;
void Update()
{
// レーザーが表面に当たる位置にdotを配置し、何にも当たらないときは非表示にする。
}
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド