視線の通り道
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 39/71。
警備員の近くにいることと、警備員に見られていることは同じではありません。間に壁があれば視線は遮られます。視線が通っているかを調べるには、目から対象に向けてレイを飛ばし、最初に当たるものが対象そのものであることを確認します。方向は対象の位置から自分の位置を引いたもので、対象まで届く長さのレイを飛ばします。
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)は、進路に壁がないことを意味します。
チャレンジ
中級プレイヤーが見えている間は番兵を赤に、そうでなければ緑にします。
bool CanSee()を作成します。Vector3 toPlayer = player.position - transform.position;を使い、toPlayer.magnitude > rangeの場合はfalseを返します。- 次に
Physics.Raycast(transform.position, toPlayer, out RaycastHit hit, range)を実行し、hit.transform == playerを返します。何も当たらなかった場合はfalseを返します。 Update()で、CanSee()の結果に応じて塔の色をColor.redまたはColor.greenに設定します。
「プレイ」を押して、壁の後ろを歩いてください。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class Sentry : MonoBehaviour
{
public Transform player;
public float range = 8f;
void Update()
{
// 歩哨がplayerを視認できる間は赤、それ以外は緑。
}
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド