순찰과 추적
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 71개 중 54번째.
순찰 중인 경비병은 플레이어를 발견할 때까지 정해진 경로를 걷고, 추격하다가 플레이어가 사라지면 경로로 돌아갑니다. 두 동작 모두 같은 방식으로 한 지점을 향해 이동하므로, 두 동작 모두 하나의 메서드로 처리할 수 있습니다. 이 경비병은 두 초소 사이를 오가며 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단위 위에 있으므로, 높이를 포함한 거리는 1보다 작아지지 않아 경비병은 방향을 바꾸지 못합니다. 검사 조건은 정확히 0이 아니라 0.2보다 작음입니다. 초당 2단위로 이동할 때 경비병은 한 걸음마다 0.04단위씩 움직이므로 초소에 정확히 도달하는 경우는 거의 없습니다.
챌린지
중급로봇이 경유 지점을 순찰하고 가까이 오는 플레이어를 쫓도록 하세요.
WalkTo(Vector3 target)를 작성해rb.linearVelocity가 지면을 따라speed만큼 이동하도록 설정하고, 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 플레이그라운드