1. 오늘 해결한 과제 (Goal)
1인칭 FPS 게임에서 화면 밖의 적 위치를 화살표로 알려주는 인디케이터를 구현하던 중, 두 가지 핵심적인 문제에 직면했습니다.
- 모든 몬스터의 평균 위치(Average Location)가 아닌, 가장 가까운 적을 정확히 가리키는 로직의 필요성.
- 몬스터가 제거되었을 때 발생하는 Pending Kill (Is Not Valid) 참조 에러 해결.
2. 핵심 구현: 최단 거리 몬스터 타겟팅 로직
단순히 Average Location을 사용하면 몬스터 무리의 중간 지점을 가리키게 되어 플레이어에게 정확한 정보를 줄 수 없었습니다. 이를 해결하기 위해 최솟값 찾기 알고리즘을 블루프린트로 구현했습니다.
구현 로직 흐름
- 초기화: MinDistance 변수를 아주 큰 값(예: 999999)으로 설정합니다.
- 전수 조사: Get All Actors of Class로 모든 몬스터를 가져와 For Each Loop를 돌립니다.
- 거리 비교: 현재 순번의 몬스터와 플레이어 사이의 거리를 계산(Get Distance To)합니다.
- 최솟값 갱신: 계산된 거리가 기존 MinDistance보다 작다면, 이 거리를 새로운 MinDistance로 저장하고 해당 몬스터를 TargetMonster 변수에 담습니다.
- 결과 도출: 루프가 끝나면 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로 체크하는 습관이 필수적이라는 것을 뼈저리게 느꼈습니다.
'TIL' 카테고리의 다른 글
| [TIL] C++ 클래스 기초: 캡슐화와 객체 간 상호작용 (feat. 언리얼 엔진 대비) (0) | 2026.04.29 |
|---|---|
| [UE5] 언리얼 C++: 좌표 이동과 확률 시스템 구현하기 (0) | 2026.04.28 |
| [Game Project] FPS 개발기: 게임 메커니즘 완성 및 UI 기능 구현 (UE 5.5.4) (0) | 2026.04.24 |
| [TIL] C++ 배열의 평균 구하기 & C언어 반복문과 배열의 기초 (0) | 2026.04.24 |
| [UE5]콜리젼을 이용한 아이템과 몬스터 행동패턴 (1) | 2026.04.23 |