Menu
CoddyTech

순찰과 추격

Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 63개 중 52번째.

순찰 중인 경비병은 플레이어를 발견할 때까지 경로를 따라 걷고, 추격한 다음 플레이어가 사라지면 경로로 돌아갑니다. 두 동작 모두 같은 방식으로 한 지점을 향해 이동하므로, 하나의 메서드로 두 동작의 이동을 처리할 수 있습니다. 이 보초는 두 초소 사이를 오가며 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 단위씩 움직여 초소에 정확히 도달하는 경우가 거의 없기 때문입니다.

challenge icon

챌린지

중급

보안 로봇이 창고를 순찰합니다. Robot 스크립트를 작성하세요. Inspector에서 waypoints(순서대로 W0부터 W3까지 네 개의 노란색 마커), player, speed(4), chaseRange(4)를 지정합니다. Player 스크립트는 준비되어 있습니다.

  • 0에서 시작하는 next라는 이름의 int 필드는 로봇이 향하는 웨이포인트의 인덱스입니다.
  • 순찰: waypoints[next]로 이동합니다. 로봇이 지면을 기준으로 웨이포인트에서 0.2보다 가까워지면 next를 다음 웨이포인트로 이동시키고, 마지막 웨이포인트 다음에는 0으로 되돌립니다.
  • 추적: 플레이어가 지면을 기준으로 chaseRange보다 가까이 있는 동안에는 대신 플레이어에게 이동합니다.
  • 플레이어가 멀어지면 로봇이 향하던 웨이포인트인 waypoints[next]로 계속 이동합니다.
  • 지면을 따라 speed 속도로 이동하도록 Rigidbody의 속도를 설정하고, y 속도는 유지합니다.

Play를 누르고, 순찰 한 바퀴를 지켜본 다음 로봇의 경로를 가로질러 이동하고 Check를 누르세요.

직접 해보기

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()
    {
        // 플레이어가 가까이 있으면 추격하고, 그렇지 않으면 순찰 경로를 따라 이동한다
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

물리와 게임플레이의 모든 레슨