오늘은 메르시 캐릭터의 크로스헤어 하단에 화살 개수를 표시하는 UI 시스템을 구현했음
기존에는 화면 왼쪽 하단에만 화살 개수가 표시되어서 조준할 때 시선을 돌려야 하는 불편함이 있다는 피드백이 있었는데, 크로스헤어 근처에 직관적으로 표시하도록 개선했음
필요한 기능들:
설계한 구조:
WBP_CrossHairImage (메인 크로스헤어)
├─ Widget Switcher (화살 타입 전환)
│ ├─ AxeArrowCounter (도끼 화살 UI)
│ └─ ChildArrowCounter (애기 화살 UI)
└─ Other UI elements...
문제 상황
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값이 반환됨

문제 상황:
위의 이미지처럼 WBP_ArrowCounter의 Default값을 설정해줬는데 실행해보면 ArrowIndicator Class가 여전히 Null로 표시
문제 원인 파악
어느 순간 WBP_CrosshairImage에 AxeArrowCounter와 ChildArrowCounter를 눌렀을 때 Details 패널이 표시되지 않는다는 걸 깨달음
아마 처음 WBP_ArrowCounter의 부모 클래스를 ArrowIndicator로 만들었다가 동적 생성을 위해 위젯 분리가 필요하다 생각해서 ArrowCounter를 만들어서 부모 클래스를 바꿔줬는데 그때 데이터가 소실될수도 있다는 문구가 떴었는데..ㅎ
아마 그걸로 문제가 생겼던 것 같음
문제 해결
배치해뒀던 AxeArrowCounter와 ChildArrowCounter를 삭제하고 다시 생성해주니 바로 해결이 되었음

최종 결과: