범위 내에서 추적하기
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 71개 중 53번째.
대부분의 적은 가까이 다가가기 전까지는 가만히 있습니다. 매 물리 업데이트 단계마다 플레이어와의 거리를 측정하고, 일정 범위 안에 있을 때만 추격하세요. 이 슬라임은 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은 적이 추격 중인지 기억하며, 두 범위 사이에서는 이 값이 바뀌지 않으므로 적은 하던 행동을 계속합니다.
챌린지
중급늑대가 플레이어가 가까이 오면 알아차리고 멀어지면 포기하게 만드세요.
FixedUpdate()에서 플레이어까지의 평면 거리를 구하세요.noticeRange보다 작으면bool chasing필드를true로 설정하고,giveUpRange보다 크면false로 설정하세요.chasing상태일 때rb.linearVelocity를 y값은 유지하면서 플레이어를 향해speed로 설정하세요.- 그렇지 않으면
rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);로 설정하세요.
‘플레이’를 누르고 늑대에게 다가간 다음 달아나세요. 그런 다음 ‘확인’을 누르세요.
직접 해보기
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()
{
// 플레이어를 발견하고, 추적을 포기할지 판단한 뒤, 쫓아가거나 가만히 서 있기
}
}
물리와 게임플레이의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드