[25.06.24] :: 가디언 앤 시커 프로젝트 17

chooha·2025년 6월 24일

가디언앤시커

목록 보기
17/25

📝 개발일지 - 크로스헤어 화살 개수 표시 UI 시스템 구현

👨‍💻 오늘의 개발 작업

오늘은 메르시 캐릭터의 크로스헤어 하단에 화살 개수를 표시하는 UI 시스템을 구현했음

기존에는 화면 왼쪽 하단에만 화살 개수가 표시되어서 조준할 때 시선을 돌려야 하는 불편함이 있다는 피드백이 있었는데, 크로스헤어 근처에 직관적으로 표시하도록 개선했음


💡 오늘의 5분 기록

1. 요구사항 분석 - 화살 타입별 UI 전환 시스템

필요한 기능들:

  • 크로스헤어 하단에 현재 화살 개수 표시
  • 화살 타입(Normal/Axe/Child)에 따라 다른 UI 표시
  • 화살 발사 시 실시간 개수 업데이트

설계한 구조:

WBP_CrossHairImage (메인 크로스헤어)
├─ Widget Switcher (화살 타입 전환)
│   ├─ AxeArrowCounter (도끼 화살 UI)
│   └─ ChildArrowCounter (애기 화살 UI)
└─ Other UI elements...

2. 첫번째 문제 - BindWidget이 안 됨

문제 상황

LogTemp: Warning: AxeArrowCounter: NULL
LogTemp: Warning: ChildArrowCounter: NULL
LogTemp: Warning: ArrowIndicatorClass: NULL

모든 위젯 바인딩이 실패하고 있었음

문제 원인 파악

CrosshairWidget = Cast<UGS_CrossHairImage>(PlayerWidgetInstance->GetWidgetFromName(TEXT("WBP_CrossHairImage")));
if (CrosshairWidget)
{
				// 메르시 캐릭터에게 크로스헤어 위젯 참조 전달
				if (AGS_Merci* MerciCharacter = Cast<AGS_Merci>(GS_Character))
				{
					MerciCharacter->SetCrosshairWidget(CrosshairWidget);
				}
}

PlayerWidgetInstance->AddToViewport(0);

디버깅 해보니 PlayerWidgetInstance가 AddToViewport되기 전에 SetCrosshairWidget함수를 호출해서 문제가 되는 거였음
CrosshairImage 위젯의 Construct가 불리기 전에 SetCrosshairWidget을 실행하니 AxeArrowCounter와 ChildArrowCounter가 생성되지 않은 상태여서 Null이 반환됨

문제 해결

// AddToViewport 먼저
PlayerWidgetInstance->AddToViewport(0);

CrosshairWidget = Cast<UGS_CrossHairImage>(PlayerWidgetInstance->GetWidgetFromName(TEXT("WBP_CrossHairImage")));
if (CrosshairWidget)
{
				// 메르시 캐릭터에게 크로스헤어 위젯 참조 전달
				if (AGS_Merci* MerciCharacter = Cast<AGS_Merci>(GS_Character))
				{
					MerciCharacter->SetCrosshairWidget(CrosshairWidget);
				}
}

이걸로 AxeArrowCounter와 ChildArrowCounter는 Null이 반환되지 않았는데, 여전히 ArrowIndicatorClass는 Null값이 반환됨

5. 두번째 문제 - 위젯 블루프린트의 Default값 설정 안됨

문제 상황:
위의 이미지처럼 WBP_ArrowCounter의 Default값을 설정해줬는데 실행해보면 ArrowIndicator Class가 여전히 Null로 표시

문제 원인 파악
어느 순간 WBP_CrosshairImage에 AxeArrowCounter와 ChildArrowCounter를 눌렀을 때 Details 패널이 표시되지 않는다는 걸 깨달음
아마 처음 WBP_ArrowCounter의 부모 클래스를 ArrowIndicator로 만들었다가 동적 생성을 위해 위젯 분리가 필요하다 생각해서 ArrowCounter를 만들어서 부모 클래스를 바꿔줬는데 그때 데이터가 소실될수도 있다는 문구가 떴었는데..ㅎ
아마 그걸로 문제가 생겼던 것 같음

문제 해결
배치해뒀던 AxeArrowCounter와 ChildArrowCounter를 삭제하고 다시 생성해주니 바로 해결이 되었음

7. 성과와 깨달은 점

최종 결과:

  • ✅ 크로스헤어 하단에 화살 개수 정상 표시
  • ✅ 화살 타입 전환 시 UI 자동 변경
  • ✅ 화살 발사 시 실시간 개수 업데이트

0개의 댓글