Menu
CoddyTech

범위 내에서 추격하기

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

대부분의 적은 가까이 다가가기 전까지는 플레이어를 내버려 둡니다. 매 물리 업데이트마다 플레이어까지의 거리를 측정하고, 일정 범위 안에서만 추격하게 하세요. 이 슬라임은 sightRange 안에서는 추격하고, 그 밖에서는 가만히 있습니다:

void FixedUpdate()
{
    Vector3 toPlayer = player.position - rb.position;
    toPlayer.y = 0f;
    if (toPlayer.magnitude < sightRange)
    {
        Vector3 dir = toPlayer.normalized;
        rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
    }
    else
    {
        rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);
    }
}

else가 중요한 이유는 Rigidbody의 속도가 무언가에 의해 바뀔 때까지 유지되기 때문입니다. 이 부분이 없으면 슬라임은 플레이어를 놓친 뒤에도 마찰로 멈출 때까지 미끄러지고, 얼음 위에서는 절대 멈추지 않습니다. 먼저 y를 0으로 설정했기 때문에 toPlayer.magnitude는 지면을 따라 잰 거리입니다. 따라서 슬라임 옆 상자 위에 서 있는 플레이어도 슬라임 바로 옆에 있는 것으로 계산됩니다.

범위를 하나만 사용하면 약점이 있습니다. 경계에 서 있는 플레이어는 범위 안팎을 오가고, 슬라임은 계속해서 움직였다 멈추기를 반복합니다. 적은 두 개의 범위로 이 문제를 피합니다. 짧은 범위 안에 플레이어가 들어오면 알아차리고, 더 긴 범위 밖으로 나가야 추격을 포기합니다. bool은 적이 추격 중인지 기억하며, 두 범위 사이에서는 이 값이 바뀌지 않으므로 적은 하던 동작을 계속합니다.

challenge icon

챌린지

중급

늑대가 숲에서 사냥합니다. 늑대에 Wolf 스크립트를 작성하세요. Inspector에서 player, speed (3), noticeRange (4), giveUpRange (8)을 지정합니다. Player 스크립트는 준비되어 있습니다.

  • chasing이라는 이름의 bool 필드는 늑대가 쫓고 있는지 나타냅니다. 처음에는 false입니다.
  • 매 물리 업데이트마다 지면을 따라(높이는 제외하고) 플레이어까지의 거리를 측정합니다. noticeRange보다 가까우면 chasing은 true가 됩니다. giveUpRange보다 멀면 false가 됩니다. 그 사이에서는 현재 상태를 유지합니다.
  • 쫓는 동안 늑대는 Rigidbody를 사용해 speed로 플레이어를 향해 달리며, y축 속도는 유지합니다. 그렇지 않으면 가만히 서 있습니다. x축과 z축 속도는 0입니다.

Play를 누르고, 늑대에게 다가간 다음 도망쳐서 Check를 누르세요.

직접 해보기

using UnityEngine;

public class Wolf : MonoBehaviour
{
    [SerializeField] private Transform player;
    [SerializeField] private float speed = 3f;
    [SerializeField] private float noticeRange = 4f;
    [SerializeField] private float giveUpRange = 8f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // 플레이어를 감지하고, 추적을 포기하거나 쫓아가거나 가만히 있는다
    }
}
quiz icon실력 점검

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

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