視線の通り道
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 37/63。
ガードの近くにいることと、ガードに見られていることは同じではありません。間に壁があると視線が遮られます。視線が通っているかを調べるには、目からターゲットに向けてレイを飛ばし、最初に当たるものがターゲット自身かどうかを確認します。方向はターゲットの位置から自分の位置を引いたもので、その長さのレイはターゲットに届きます。
public Transform target;
bool CanSee()
{
Vector3 toTarget = target.position - transform.position;
if (Physics.Raycast(transform.position, toTarget, out RaycastHit hit, toTarget.magnitude))
{
return hit.transform == target;
}
return false;
}柱の上にある防犯カメラは、CanSee()がtrueの間、I see youを記録します。ターゲットが開けた場所にいる場合、レイが最初に当たるのはターゲットです。ターゲットが木箱の後ろにいる場合、レイは最初に木箱に当たり、hit.transformは木箱のものになるため、結果はfalseです。Physics.Raycast単体でも木箱に対してtrueを返すため、ヒットした対象をターゲットと比較します。
レイがターゲットを見つけるには、ターゲットにコライダーが必要です。レイの長さはmaxDistanceから決まるため、方向を正規化する必要はありません。Physics.Linecast(from, to)は逆の問い、つまり2点間にコライダーがあるかどうかを調べます。!Physics.Linecast(eye, target.position, wallMask)は、邪魔になる壁がないことを意味します。
チャレンジ
中級見張り塔はプレイヤーを監視します。Sentry スクリプトは塔にアタッチされており、Inspector で player と range に 8 を設定します。塔の色は見えているものを示します。
- プレイヤーが見えている間は塔を赤色(
Color.red)にし、そうでない場合は緑色(Color.green)にします。 - プレイヤーが
range単位以内にいて、その間に何もない場合にのみ、プレイヤーが見えます。
Play を押して、矢印キーでプレイヤーを壁の周りに移動させてから、Check を押します。
自分で試してみよう
using UnityEngine;
public class Sentry : MonoBehaviour
{
public Transform player;
public float range = 8f;
void Update()
{
// 見張りがplayerを視認できる間は赤、それ以外は緑。
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。