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

RecastNavMesh export/load flags 크래시 진단

926 단어
5 분
RecastNavMesh export/load flags 크래시 진단

특정 저장 데이터를 불러오다 아래 오류가 발생하며 게임이 종료됐다.

RecastNavMesh /Game/Maps/<MapName>.<MapName>:PersistentLevel.RecastNavMesh-Default
was found in memory and is an export but does not have all load flags.

문제 현상#

모든 지도나 새 게임에서 발생한 것은 아니며 저장 데이터가 특정 지도를 참조할 때만 재현됐다. 오류 문자열을 보면 메모리에 이미 존재하는 RecastNavMesh 객체가 패키지 export로도 발견됐지만, 현재 로드가 요구하는 flags를 갖추지 못한 상태다.

적용 범위#

대상은 Unreal Engine에서 Recast 기반 내비게이션을 사용하는 경우다. 오류 경로에는 지도 패키지의 RecastNavMesh-Default가 직접 나타난다. 같은 load flags 오류라도 지목된 객체가 다르면 그 객체의 생성·저장 경로부터 별도로 조사해야 한다.

원인#

문제가 된 지도에는 Nav Mesh Bounds Volume이 없었다. 이 상태가 저장된 내비게이션 객체와 맞물렸다. Unreal은 유효한 내비게이션 영역을 기준으로 Recast 내비게이션 데이터를 생성한다. 지도의 bounds를 제거하거나 내비게이션 데이터를 다시 저장하는 과정에서 패키지 안의 export와 런타임 생성 상태가 어긋난 것으로 판단했다.

다만 오류 한 줄만으로 원인을 일반화해서는 안 된다. stale cooked asset이나 서로 다른 엔진 버전에서 만든 저장 데이터, 지도 redirect, 패키징 결과가 섞인 경우에도 비슷한 로드 불일치가 생기기도 한다.

재현 및 진단#

  1. 오류에 표시된 지도와 객체 경로를 기록한다.
  2. 해당 지도를 editor에서 열고 Nav Mesh Bounds Volume과 RecastNavMesh-Default의 존재를 확인한다.
  3. P 키로 내비게이션 영역을 표시해 실제 이동 영역이 생성되는지 확인한다.
  4. 저장 데이터 없이 지도를 직접 열 때와 저장 데이터를 복원할 때를 나눠 재현한다.
  5. 패키징 빌드라면 기존 cooked output을 섞지 않은 깨끗한 빌드에서도 확인한다.

해결 방법#

문제가 된 지도에 Nav Mesh Bounds Volume을 추가해 이동 가능한 영역을 포함했다. 지도를 저장한 뒤 내비게이션 데이터를 다시 생성했다. 이후 새 빌드와 새 프로세스에서 같은 저장 데이터를 불러오자 크래시가 사라졌다.

이 수정은 해당 지도에 내비게이션이 실제로 필요한 경우에만 적절하다. 내비게이션을 사용하지 않는 지도라면 bounds를 억지로 추가하기 전에 저장 데이터가 그 지도의 RecastNavMesh를 참조하는 이유부터 확인해야 한다.

검증 방법#

  • editor와 패키징 빌드에서 각각 새 게임과 기존 저장 데이터 로드를 반복한다.
  • server travel이나 level streaming을 쓴다면 최초 진입과 재진입을 모두 확인한다.
  • RecastNavMesh-Default가 지도 저장 후 의도치 않게 다시 사라지지 않는지 source control diff로 확인한다.
  • 내비게이션 경로 탐색과 AI 이동도 함께 검사한다.

주의점#

Nav Mesh Bounds Volume을 다시 제거하면 저장 과정에서 생성된 내비게이션 객체가 달라지기도 한다. 오류를 숨기려고 load flags 검사를 우회하거나 저장 데이터를 무조건 폐기하면 패키지 상태 불일치의 원인이 남는다.

참고 자료#

글 공유하기

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

RecastNavMesh export/load flags 크래시 진단
https://hon454.github.io/posts/recastnavmesh-export-load-flags/
작성자
Jihoon Jeon
게시일
2024-05-18
라이선스
CC BY-NC-SA 4.0
관련 게시글스마트
1
Unreal Engine PIE에서 클라이언트와 서버 값을 한 줄로 비교하기
Unreal EnginePIE에서 클라이언트 코드가 같은 프로세스의 서버 월드와 서버 측 PlayerController를 찾아 위치·속도를 한 줄로 비교하는 에디터 전용 디버그 코드와, 네트워크 에뮬레이션으로 확인한 측정 결과를 정리합니다.
2
면접 오답노트: 말하지 못한 주요 개념, Net Relevancy
Unreal Engine면접에서 제대로 답하지 못한 Net Relevancy를 다시 정리한다. AActor::IsNetRelevantFor의 판정 순서와 문서와 다른 부분, Owner가 판정을 바꾸는 방식, 연관성을 잃고 되찾을 때 RelevantTimeout과 액터 파괴, BeginPlay, OnRep, RPC에 생기는 일, ForceNetRelevant와 Replication Graph, Iris에서의 주의점, Dormancy, Priority와의 차이를 다룬다.
3
언리얼 엔진의 리플리케이션 및 RPC 순서 보장
Unreal Engine프로퍼티 복제와 OnRep, RPC의 순서 보장 범위를 살펴보고, 일시적인 상태 불일치와 액터 간 준비 순서를 처리하는 방법을 예시로 정리한다.
4
[노트] Unreal Engine Skills for Claude Code
Unreal EngineEpic Games가 공개한 Claude Code 플러그인 Unreal Engine Skills for Claude Code의 스킬 3개와 SessionStart 훅을 읽고, 스킬의 트리거 설계와 문서화 규칙, 엔진 쪽 Agent Skill, 보안 경고의 범위, MCP와 스킬의 역할 분담, Claude Code용만 나온 점에 대한 생각을 정리한다.
5
언리얼 엔진 5.8 MCP로 본 게임 개발과 에이전틱 코딩의 거리
Unreal Engine언리얼 엔진 5.8 MCP를 Claude Code와 Codex로 써 보고 Epic 세션을 보며, All Toolsets에 이미 포함된 Editor Toolset, 일괄 작업과 비용, 에디터 의존성, 프로젝트 구조 지식의 필요성에 대해 생각한 점을 정리한다.
무작위 게시글무작위

댓글

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
목차