Menu
CoddyTech

視線の通り道

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

challenge icon

チャレンジ

中級

見張り塔はプレイヤーを監視します。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を視認できる間は赤、それ以外は緑。
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

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