巡回と追跡
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 54/71。
巡回中の警備員は、プレイヤーを見つけるまで経路を歩き、追跡し、プレイヤーがいなくなると経路に戻ります。どちらの動作も同じように、ある地点に向かって移動するため、両方の歩行に1つのメソッドを使えます。この歩哨は2つの持ち場の間を往復し、chaseRange以内にプレイヤーがいると追跡します。
[SerializeField] private Transform pointA;
[SerializeField] private Transform pointB;
[SerializeField] private Transform player;
[SerializeField] private float speed = 2f;
[SerializeField] private float chaseRange = 5f;
private Rigidbody rb;
private Transform goal;
void Start()
{
rb = GetComponent<Rigidbody>();
goal = pointA;
}
void FixedUpdate()
{
if (Flat(player.position - rb.position).magnitude < chaseRange)
{
WalkTo(player.position);
return;
}
if (Flat(goal.position - rb.position).magnitude < 0.2f)
{
goal = goal == pointA ? pointB : pointA;
}
WalkTo(goal.position);
}
void WalkTo(Vector3 target)
{
Vector3 dir = Flat(target - rb.position).normalized;
rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}
Vector3 Flat(Vector3 v)
{
return new Vector3(v.x, 0f, v.z);
}追跡の判定を先に行い、その中のreturnで巡回のコードを飛ばすため、プレイヤーが近くにいるときは追跡が優先されます。goalはフィールドなので、歩哨は追跡中もその値を保持します。プレイヤーがいなくなると、向かっていた持ち場まで歩き続けます。
到着判定では、地面に沿った距離を測ります。持ち場は床の目印で、歩哨の中心はその1 unit上にあるため、高さを含めて距離を測ると1未満にはならず、歩哨は決して向きを変えません。この判定では、距離がちょうど0ではなく0.2未満かどうかを調べます。秒速2 unitでは歩哨は1ステップごとに0.04 unit進むため、持ち場にぴったり到着することはほとんどありません。
チャレンジ
中級ロボットにウェイポイントを巡回させ、近づいてきたプレイヤーを追いかけさせましょう。
WalkTo(Vector3 target)を記述し、地面に沿ってその方向へ進むようにrb.linearVelocityを設定し、y方向の速度は維持します。FixedUpdate()で、プレイヤーがchaseRangeより近くにいる場合は、WalkTo(player.position)を呼び出してreturnします。- それ以外の場合は、
waypoints[next]からの距離が0.2未満になったら、next = (next + 1) % waypoints.Length;を設定し、その後waypoints[next]へ向かって歩かせます。
「プレイ」を押して、その進路を横切ってみましょう。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class Robot : MonoBehaviour
{
[SerializeField] private Transform[] waypoints;
[SerializeField] private Transform player;
[SerializeField] private float speed = 4f;
[SerializeField] private float chaseRange = 4f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// playerが近くにいるときは追いかけ、そうでなければ巡回ルートを歩く
}
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド