Navmesh - 클릭 방식 이동, Nav mesh Obstacle 활용
Navmesh - 길이 이어지지 않은 공간 지나기 (NavMeshLink, Area Cost)
최근 계속 2D관련 프로젝트만 진행하여 오랜만에 학습 종류를 환기할 겸 3D관련 학습을 진행하기로 하였다.그중 이전 3D 관련 프로젝트를 진행할 때 흥미롭게 다뤘던 Navmesh 시스템에 대해서 심화
toacode.tistory.com
얼마 전 Navmesh의 Link를 활용한 끊어진 길 건너기와 AreaCost 등의 사용을 다뤘다.
이러한 Navmesh를 사용하게 되면 A star와 같은 경로 찾기 알고리즘의 사용 없이 최적의 이동 경로를 Cost에 따라 선택할 수 있기에 활용도가 높으며 많은 게임에서도 클릭 이동 형식으로 사용되고 있다.
따라서 해당 기능을 실제 게임에 적용하고자 한다면 클릭을 통한 이동또한 Navmesh로 구현할 수 있어야 하기 때문에 추가적인 학습을 진행하였다.
클릭시 카메라에서의 레이캐스팅을 통해 원하는 지면의 포인트를 Agent 의 Destination 포인트로 설정하도록 만들어 주었다.
NavMeshAgent agent;
[SerializeField] Transform point;
private void Update()
{
if (Input.GetMouseButtonDown(0)) // 마우스 왼쪽 버튼 클릭
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
agent.SetDestination(hit.point);
point.gameObject.SetActive(true);
point.position = hit.point; // 클릭한 위치에 포인트 이동
}
}
else if (agent.remainingDistance < 0.1f)
{
point.gameObject.SetActive(false); // 이동이 끝나면 포인트 비활성화
}
}
이후 원하는 위치를 클릭 하면, Link가 적용된 부분또한 자연스럽게 길처럼 사용하며 이동하는 모습을 확인할 수 있다.

간단하게 이동 포인트에 원을 표시하는것으로 시각 효과를 주었으나, 일부 게임의 경우 클릭 시 이동 경로까지 표시를 해준다.
그러한 시각 효과의 경우 라인렌더러 기능과 코루틴을 적절히 조합하면 경로상의 지면에 이동 경로를 선으로 표시할 수 있다.
내비메시 장애물 - Unity 매뉴얼
Nav Mesh Obstacle 컴포넌트로 내비메시 에이전트가 월드를 탐색하는 동안 피해야 하는 움직이는 장애물(예: 물리 시스템에 의해 제어되는 배럴 또는 크레이트)을 설명할 수 있습니다. 장애물이 움직
docs.unity3d.com
이왕 이러한 이동을 구현한 김에 앞전에 간단히 말로만 설명한 Nav Mesh Obstacle 기능도 다뤄보면 좋을 것 같다.

Nav Mesh Obstacle는 위와같은 구조로,
Carve를 체크하게 되면 Agent의 이동경로상에 있을 경우 자동으로 우회해서 가도록 만드는 기능이다.
Carve Only Stationary은 체크시 만약 이동하는 장애물일 때 이동이 멈춘 시점만 우회 기능이 작동되는 형식으로, 주기적으로 움직이는 오브젝트에 Carve 설정 시 계속되는 경로 변경의 연산코스트를 절약할 수 있는 옵션이다.
Time To Stationary는 장애물이 정지후 실제로 정지되었다고 판정을 내릴 때까지 걸리는 시간이다.
등의 다양한 설정이 존재하며 상황에 맞도록 여러가지 보조 설정을 사용하면 자연스러운 장애물의 구현이 가능해진다.

만약 위 기능을 실제 게임에 적용하고자 한다면, 움직이는 벽 또는 문에 사용하여 장애물이 존재하지 않을 경우에만 클릭 시 해당 경로로 이동할 수 있도록 하는 등의 방식이 적절할 것 같다.