범위 내에서 추격하기
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은 적이 추격 중인지 기억하며, 두 범위 사이에서는 이 값이 바뀌지 않으므로 적은 하던 동작을 계속합니다.
챌린지
중급늑대가 숲에서 사냥합니다. 늑대에 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()
{
// 플레이어를 감지하고, 추적을 포기하거나 쫓아가거나 가만히 있는다
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.