TIL

[UE5]가장 가까운 몬스터 추적 UI 및 Is Valid 에러 해결

think95592 2026. 4. 27. 20:55

1. 오늘 해결한 과제 (Goal)

1인칭 FPS 게임에서 화면 밖의 적 위치를 화살표로 알려주는 인디케이터를 구현하던 중, 두 가지 핵심적인 문제에 직면했습니다.

  1. 모든 몬스터의 평균 위치(Average Location)가 아닌, 가장 가까운 적을 정확히 가리키는 로직의 필요성.
  2. 몬스터가 제거되었을 때 발생하는 Pending Kill (Is Not Valid) 참조 에러 해결.

2. 핵심 구현: 최단 거리 몬스터 타겟팅 로직

단순히 Average Location을 사용하면 몬스터 무리의 중간 지점을 가리키게 되어 플레이어에게 정확한 정보를 줄 수 없었습니다. 이를 해결하기 위해 최솟값 찾기 알고리즘을 블루프린트로 구현했습니다.

구현 로직 흐름

  1. 초기화: MinDistance 변수를 아주 큰 값(예: 999999)으로 설정합니다.
  2. 전수 조사: Get All Actors of Class로 모든 몬스터를 가져와 For Each Loop를 돌립니다.
  3. 거리 비교: 현재 순번의 몬스터와 플레이어 사이의 거리를 계산(Get Distance To)합니다.
  4. 최솟값 갱신: 계산된 거리가 기존 MinDistance보다 작다면, 이 거리를 새로운 MinDistance로 저장하고 해당 몬스터를 TargetMonster 변수에 담습니다.
  5. 결과 도출: 루프가 끝나면 TargetMonster에는 나랑 가장 가까운 놈만 남게 됩니다.


3. 트러블슈팅: Blueprint Runtime Error 해결

문제 상황

잘 작동하던 UI가 몬스터를 처치하는 순간 다음과 같은 에러를 뿜으며 멈추는 현상이 발생했습니다.

“Attempted to access ... via property Ants, but ... is not valid (pending kill or garbage)”

원인 분석

몬스터가 체력이 0이 되어 Destroy Actor로 월드에서 사라졌음에도 불구하고, UI는 여전히 그 몬스터의 위치 좌표를 가져오려 시도했기 때문입니다. 즉, **"이미 죽어서 없는 존재의 주소를 묻는 상태"**가 된 것입니다.

해결 방법: Is Valid 검사

데이터를 참조하기 직전에 반드시 Is Valid 노드를 배치하여 해당 몬스터가 현재 월드에 실제로 존재하는지 확인하는 방어 로직을 추가했습니다.

  • Is Valid (True): 몬스터가 살아있을 때만 좌표 계산 및 화살표 회전 수행.
  • Is Not Valid (False): 몬스터가 죽었다면 UI 업데이트를 중단하거나 화살표를 숨김.

4. 오늘의 회고

    • 성공한 점: 단순히 기능을 만드는 것을 넘어, For Each Loop와 거리 계산을 조합해 실제 게임에서 쓰이는 타겟팅 시스템의 기초를 다졌습니다.
    • 배운 점: 언리얼 엔진에서 **'참조(Reference)'**를 다룰 때는 항상 대상이 사라질 경우를 대비해 Is Valid로 체크하는 습관이 필수적이라는 것을 뼈저리게 느꼈습니다.