영상을 불러오지 못했습니다

MoveDirectlyToward가 NavMesh 없이 멈출 때 확인할 것

738 단어
4 분
MoveDirectlyToward가 NavMesh 없이 멈출 때 확인할 것

Behavior Tree에서 MoveDirectlyToward를 사용했지만 NavMesh가 없는 level에서는 pawn이 움직이지 않았다. 당시에는 “이 task도 NavMesh가 필요하다”고 결론 내렸지만 현재 공식 API 설명과는 맞지 않는다.

확인된 계약#

Epic의 UBTTask_MoveDirectlyToward 문서는 이 task가 navigation system을 고려하지 않고 goal로 직접 이동한다고 명시한다. NavMesh를 추가했더니 우연히 동작했다는 관찰만으로 NavMesh가 필수라고 일반화하면 안 된다.

적용 범위#

AIController, Behavior Tree와 path following으로 Character 또는 custom pawn을 움직이는 UE 프로젝트에 해당한다. 엔진 버전에 따른 task 구현 차이는 exact source revision에서 확인한다.

가능한 원인#

  • AIController가 pawn을 possess하지 않았거나 Behavior Tree 자체가 실행되지 않는다.
  • blackboard key가 actor/vector 기대 타입과 다르거나 값이 유효하지 않다.
  • pawn의 movement component가 path following 요청을 지원하지 않는다.
  • 이동 mode, max speed 또는 input/acceleration 설정이 0이다.
  • acceptance radius와 reach test 때문에 시작 즉시 성공 처리된다.
  • collision이나 movement constraint가 직선 이동을 막는다.
  • 특정 엔진 버전에서는 task 또는 custom movement component가 navigation data 존재를 간접 전제로 삼는다.

재현 및 진단#

  1. Behavior Tree debugger에서 task 진입·종료 상태와 blackboard 값을 살펴본다.
  2. AIController, pawn, movement component와 path following component가 유효한지는 로그로 남긴다.
  3. MoveToMoveDirectlyToward에는 같은 goal을 넣어 비교한다.
  4. NavMesh 유무만 바꾸고 나머지 actor·collision 설정은 고정한다.
  5. task source를 열어 실제 이동 요청과 failure 조건을 직접 확인해 본다.

해결 방법#

먼저 possess, blackboard key와 movement component 계약을 고친다. custom pawn은 path following이 요구하는 이동 interface를 구현한다. navigation/path following을 전혀 쓰지 않는 설계라면 custom BT task에서 방향을 계산하고 pawn의 movement/input API를 명시적으로 호출한다.

일반 MoveTo도 함께 필요하거나 level의 AI 이동 공간을 실제로 정의해야 할 때 NavMesh를 추가한다. MoveDirectlyToward 하나를 살리는 필수 조건으로 취급하지 않는다.

검증 방법#

  • 빈 level과 NavMesh level에 같은 pawn을 두고 시험한다.
  • actor goal과 vector goal, 가까운 거리와 먼 거리를 비교한다.
  • success, failure, abort 결과와 실제 이동 거리는 함께 기록해 둔다.
  • dedicated server에서는 authoritative movement도 확인한다.

주의점#

직선 이동은 obstacle을 우회하지 않는다. NavMesh를 사용하지 않아도 collision이나 낙하 위험이 자동으로 처리되는 것은 아니다. 현재 초안은 과거 관찰을 바로잡은 진단 가이드다. 당시 프로젝트의 정확한 custom movement 구현이 없어 하나의 확정 원인으로 좁히지는 않았다.

참고 자료#

글 공유하기

이 글이 도움이 되셨다면 다른 사람과 공유해 주세요!

MoveDirectlyToward가 NavMesh 없이 멈출 때 확인할 것
https://hon454.github.io/posts/unreal-engine-move-directly-toward-without-navmesh/
작성자
Jihoon Jeon
게시일
2023-05-30
라이선스
CC BY-NC-SA 4.0

댓글

Profile Image of the Author
Jihoon Jeon
안녕하세요! 서브컬처와 자전거를 사랑하는 개발자 전지훈입니다.
공지사항
제 블로그에 오신 것을 환영합니다! 예시 공지입니다.
카테고리
태그
최신 일상
사이트 통계
게시글
46
카테고리
10
태그
139
총 단어 수
103,271
운영 일수
0
최근 활동
0일 전
사이트 정보
빌드 플랫폼
GitHub Actions
블로그 버전
Firefly v6.16.3
라이선스
CC BY-NC-SA 4.0