2024. 1. 26. 23:43ㆍ내외 교육들/TIL
오늘 배운 것 및 개발 과정
줄곧 프로젝트를 할때 했던 트러블 슈팅을 TIL로 작성해보았다. 내가 겪은 트러블 슈팅은 Nav Mesh Agent 컴포넌트에 관한 것이다.
먼저 NPC의 움직임에는 외부 패키지 NavMesh2d라는 3d에 특화된 Navigation AI의 NavMesh를 2d에 적용하기 쉽게 외국 개발자가 개조한 패키지이다. 이것을 통해서 평면의 배경 상에서 2D 오브젝트들이 장애물을 피해 움직이는 동작을 적용하였다.
<문제발생>
단일 NPC의 움직임은 쉽게 성공했다. 여기서 NPC의 세부 기능을 구현하는 도중에 실험으로 여러 개의 NPC 오브젝트들을 특정 목표로 이동하는 상황을 재현해보았는데 NPC와 NPC 사이에 안보이는 벽이 있는 것처럼 둘다 끼어서 움직이지 못하는 상황이 되어버렸다.
<원인분석>
정확한 상황을 재현하자면 한 NPC와 다른 NPC는 서로 다른 타겟을 통해 NavMeshAgent로 타겟팅을 하는 스크립트에 따라서 목표로 이동하고 있는 상황이였다. 둘이 가까이 오는 상황이며 한 쪽은 장애물이고 반대쪽은 NavMesh가 구워지지 않는 빈 공간, 즉 외진 곳이였다. 마치 골목길에 있는 것처럼 말이다. 둘이 거의 가까이 왔을 때 둘은 서로 맞닿는 것이 아닌 틈이 있는 상황에서 서로 통과를 못하고 있는 상황이였다. 일단 Collider2d 컴포넌트가 적용된 상태였고 Rigidbody2d 조차 없는 상황이였다. 다만 Collider의 모양을 캡슐로 해놓았는데 Scene 뷰에서는 원형 모양의 초록색 Collider 도형으로 나오고 있어, Collider 이외에 다른 컴포넌트가 나올 수 있는 상황이라면 아무래도 Nav Mesh Agent 컴포넌트라고 생각했다. 그래서 컴포넌트의 property를 확인하는 도중에 obstacle avoidance 가 있었는데 바로 이것이 끼여버린 현상을 초래하는 것이다. 이 옵션에 대한 설명은 유니티 도큐멘터리와 구글링을 통해서 조사한 결과 캐릭터 겹침, 회피, 밀어내기와 같은 문제를 해결하는데에 사용하는 것인데, 그 중 Quality는 '장애물 회피 품질입니다. 에이전트의 수가 많다면 장애물 회피 품질을 줄임으로써 CPU 시간을 절약할 수 있습니다. 회피를 없음으로 설정할 경우 충돌만 해결할 수 있을 뿐 다른 에이전트와 장애물에 대한 적극적인 회피는 하지 않습니다.' 라고 설명이 나와있었다.
<결론>
결론은 Quality의 품질 값을 낮아진다면 NPC의 과도적인 충돌 현상을 해결할 수 있었다. 게임의 특징상 그렇게 현실적으로 충돌하는 것을 바라지 않는다고 생각해서 서로 통과하도록 Quality의 품질을 none으로 맞추었더니, 서로 통과하게 되었다. 비록 장애물 회피라도 반드시 충돌해야하는 bake의 구역 밖으로 벗어나지 않고 정상적으로 장애물을 인지하고 가도록 해결하였다.
하루 마무리 및 내일 할 것
이걸 먼저했었어야 했다. 내가 관심있게 이 현상을 예측하지 않았기에 늦게 나온 버그였다. 앞으로도 기능을 개발하면서 여러 현상을 예측하고 테스트를 해봐야 겠다.
'내외 교육들 > TIL' 카테고리의 다른 글
2024-01-30) 중간 발표를 위한 준비 (1) | 2024.01.30 |
---|---|
2024-01-29) 중간점검 및 모의면접 2차 (0) | 2024.01.29 |
TIL)2024-01-25 스크립터블 오브젝트 (1) | 2024.01.25 |
TIL)2024-01-24 구현 진행중 (0) | 2024.01.24 |
TIL)2024-01-23 NPC 개발 기획 다시 정리 및 복습의 시간 (0) | 2024.01.23 |