
UE5 Mass AI ZoneGraph Disturbance Annotation에서 FloatCastChecked/FloatFitsIn 어설션으로 바로 종료되는 크래시 원인/대응 정리
ZoneGraph Disturbance BP Library의 Trigger Danger 노드 실행 시 에디터가 그 자리에서 바로 종료되는 문제 발생.
크래시 내역
Assertion failed: FloatFitsIn<OutType>(In, Precision) [File:D:\build++UE5\Sync\Engine\Source\Runtime\Core\Public\Templates\UnrealTemplate.h] [Line: 197]
Loss of data caused by narrowing conversion
UnrealEditor_Core
UnrealEditor_ZoneGraphAnnotations
UnrealEditor_ZoneGraphAnnotations
UnrealEditor_Engine
UnrealEditor_Engine
UnrealEditor_Renderer
UnrealEditor_Renderer
UnrealEditor_Engine
UnrealEditor_Engine
UnrealEditor_Engine
UnrealEditor_Engine
UnrealEditor_Engine
UnrealEditor_Engine
UnrealEditor_UnrealEd
UnrealEditor_UnrealEd
UnrealEditor
UnrealEditor
UnrealEditor
UnrealEditor
UnrealEditor
UnrealEditor
kernel32
ntdll콜스택 보면 시작점이 UnrealEditor_ZoneGraphAnnotations 쪽이고, 그 다음이 Engine, 그리고 Renderer로 이어지는데 보통 게임플레이 로직보단 디버그 드로잉/렌더링 경로에서 무언가 터졌음을 의미한다.
Mass AI의 ZoneGraph 시스템은 다수 에이전트를 처리하려고 런타임 데이터를 “정해진 비트 수 / 정해진 정밀도” 형태로 압축해서 다룬다.
UE5 LWC(Large World Coordinates)에서는 월드 좌표가 double(64-bit) 기반이라 멀리 나가도 버티지만 문제는 이 값이 어디선가 float나 정수로 좁혀질 때인데 UE는 여기서 잘라먹고 넘어가는 걸 (narrowing) 막으려고 FloatFitsIn 계열 보호 assert를 걸어둔다. 그래서 값이 일정 범위 넘으면 그냥 바로 종료된다.
UZoneGraphDisturbanceAnnotation::DebugDraw() 쪽 보면 대충 이런 패턴이 있다.
// DebugDraw() 내부
const float DistanceSq =
FloatCastChecked<float>(FVector::DistSquared(ViewLocation, SomePosition),
UE::LWC::DefaultFloatPrecision);문제는 DistSquared가 이름 그대로 “거리의 제곱”이라 숫자가 빠르게 커진다. LWC 월드에서 카메라랑 대상이 좀 멀어지기만 해도 이 값이 float 최대치를 넘는데 생각보다 쉽게 일어난다.
그래서 어떤 프레임에서는 DistSquared 자체는 계산이 되는데(원래는 double 쪽에서), 그걸 FloatCastChecked<float>로 옮기는 순간 assert가 터진다.
로딩 중...
해결 방법은 디버그 드로잉 옵션을 끄는 것이다.
ZoneGraphDisturbanceAnnotation 컴포넌트의 Enable Debug Drawing 옵션을 끄면, 최소한 “렌더링 프레임에서 float 캐스팅 하다 죽는” 경로는 바로 차단된다.
이 문제 핵심은 디버그 드로잉 환경에서 float로 캐스팅하다가 크래시가 나는 것인데 DistSquared 값에 대해서 float 캐스팅 체크를 걸어둔 자세한 이유는 모르겠지만 double로 처리하면 해결될 것으로 보인다.
성능을 위해 ZoneGraph에서 데이터 정밀도 압축 검증이랑, LWC 환경에서 값이 생각보다 쉽게 커지는 특성이 디버그 드로잉 경로에서 충돌한 케이스.
디버그 드로잉 끄는 게 제일 빠르고 제대로 고치려면 디버그 거리 판단은 double로 처리하고 안전할 때만 float로 바꾸는 것이 제일 깔끔하다.