Menu
CoddyTech

視線の通り道

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)は、進路に壁がないことを意味します。

challenge icon

チャレンジ

中級

プレイヤーが見えている間は番兵を赤に、そうでなければ緑にします。

  1. bool CanSee()を作成します。Vector3 toPlayer = player.position - transform.position;を使い、toPlayer.magnitude > rangeの場合はfalseを返します。
  2. 次にPhysics.Raycast(transform.position, toPlayer, out RaycastHit hit, range)を実行し、hit.transform == playerを返します。何も当たらなかった場合はfalseを返します。
  3. Update()で、CanSee()の結果に応じて塔の色をColor.redまたはColor.greenに設定します。

「プレイ」を押して、壁の後ろを歩いてください。その後、「確認」を押します。

自分で試してみよう

using UnityEngine;

public class Sentry : MonoBehaviour
{
    public Transform player;
    public float range = 8f;

    void Update()
    {
        // 歩哨がplayerを視認できる間は赤、それ以外は緑。
    }
}

物理演算とゲームプレイのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド