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

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. MoveTo와 MoveDirectlyToward에는 같은 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
관련 게시글스마트
1
면접 오답노트: 말하지 못한 주요 개념, Net Relevancy
Unreal Engine면접에서 제대로 답하지 못한 Net Relevancy를 다시 정리한다. AActor::IsNetRelevantFor의 판정 순서와 문서와 다른 부분, Owner가 판정을 바꾸는 방식, 연관성을 잃고 되찾을 때 RelevantTimeout과 액터 파괴, BeginPlay, OnRep, RPC에 생기는 일, ForceNetRelevant와 Replication Graph, Iris에서의 주의점, Dormancy, Priority와의 차이를 다룬다.
2
언리얼 엔진의 리플리케이션 및 RPC 순서 보장
Unreal Engine프로퍼티 복제와 OnRep, RPC의 순서 보장 범위를 살펴보고, 일시적인 상태 불일치와 액터 간 준비 순서를 처리하는 방법을 예시로 정리한다.
3
[노트] Unreal Engine Skills for Claude Code
Unreal EngineEpic Games가 공개한 Claude Code 플러그인 Unreal Engine Skills for Claude Code의 스킬 3개와 SessionStart 훅을 읽고, 스킬의 트리거 설계와 문서화 규칙, 엔진 쪽 Agent Skill, 보안 경고의 범위, MCP와 스킬의 역할 분담, Claude Code용만 나온 점에 대한 생각을 정리한다.
4
언리얼 엔진 5.8 MCP로 본 게임 개발과 에이전틱 코딩의 거리
Unreal Engine언리얼 엔진 5.8 MCP를 Claude Code와 Codex로 써 보고 Epic 세션을 보며, All Toolsets에 이미 포함된 Editor Toolset, 일괄 작업과 비용, 에디터 의존성, 프로젝트 구조 지식의 필요성에 대해 생각한 점을 정리한다.
5
Night of the Dead 멀티플레이를 지금 다시 설계한다면
Unreal EngineNight of the Dead의 멀티플레이 최적화를 새 프로젝트에서 처음부터 설계한다면 바꿀 부분을 좀비의 Mass 전환, Push Model과 Fast Array와 연결별 서브오브젝트 필터를 쓰는 복제, 애플리케이션 계층의 전송 흐름 제어로 나눠 기존 코드와 비교한다.
무작위 게시글무작위

댓글

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