08/13 NavMesh를 사용한 추적, 순찰, 시야, 충돌 처리

본문 로딩 중...
댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.

댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
거리 3개 설계: 감지·공격·포기
using UnityEngine;
using UnityEngine.AI;
public class EnemyChaser : MonoBehaviour
{
[SerializeField] Transform target;
[SerializeField] float detectionRange = 4f;
[SerializeField] float attackRange = 1f;
[SerializeField] float giveUpRange = 6f;
[SerializeField] float rotateSensitivity;
NavMeshAgent agent;
bool hasDetectionTarget;
void Awake()
{
agent = GetComponent<NavMeshAgent>();
agent.stoppingDistance = attackRange;
}
private void Update()
{
if (target == null)
return;
// 다만 이렇게 했었을 때는, 벽 유무와 상관없이 거리만 좁혀지면 인식함.
float distance = Vector3.Distance(transform.position, target.position);
// 감지
if (!hasDetectionTarget && distance < detectionRange)
{
hasDetectionTarget = true;
}
// 포기
if (hasDetectionTarget && distance >= giveUpRange)
{
hasDetectionTarget = false;
agent.ResetPath();
return;
}
// 대기
if (!hasDetectionTarget)
{
return;
}
if (distance > attackRange)
{
// 추적
agent.isStopped = false;
agent.SetDestination(target.position);
}
else
{
// 공격
agent.isStopped = true;
LookAtTarget();
Debug.Log("공격중");
}
}
private void LookAtTarget()
{
Vector3 direction = target.position - transform.position;
direction.y = 0;
// 떨림 현상 방지
if (direction.sqrMagnitude < 0.01f)
{
return;
}
// 회전값을 부드럽게 보간
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(direction), Time.deltaTime * rotateSensitivity);
}
}
주요 내용
agent.ResetPath()는 NavMeshAgent가 현재 가지고 있는 이동 경로를 삭제하고 이동을 멈추게 하는 함수를 사용하였다.Nav Mesh Obstacle
Nav Mesh Obstacle은 NavMesh Agent가 해당 오브젝트를 장애물로 인식하고 피해 이동하도록 만드는 컴포넌트입니다.

| 항목 | 현재 설정 | 설명 |
|---|---|---|
| Shape | Box | 장애물 영역의 모양입니다. Box 또는 Capsule을 사용할 수 있습니다. |
| Center | X 0, Y 0, Z 0 | 오브젝트 기준 장애물 영역의 중심 위치입니다. |
| Size | X 1, Y 1, Z 1 | Box 장애물 영역의 가로·높이·깊이 크기입니다. |
| Carve | 켜짐 | NavMesh에 구멍을 만들어 Agent가 장애물을 우회하도록 경로를 다시 계산합니다. |
| Move Threshold | 0.1 | 장애물이 이 거리 이상 움직이면 Carve 영역을 갱신합니다. 값이 작을수록 자주 갱신됩니다. |
| Time To Stationary | 0.1초 | 장애물이 멈춘 뒤 정지 상태로 판단할 때까지 기다리는 시간입니다. |
| Carve Only Stationary | 꺼짐 | 켜면 장애물이 정지했을 때만 NavMesh를 파냅니다. 현재 설정에서는 이동 중에도 Carve가 갱신될 수 있습니다. |

우리들의 게임 발매 이야기

안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다


안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다
