Unreal
[Unreal Error] UWidgetComponent::GetUserWidgetObject()가 Null 값을 반환하는 경우
푸쿠이
2021. 5. 11. 12:49
참고 문서
answers.unrealengine.com/questions/865724/view.html
상황
책 '이득우의 언리얼 C++ 게임 개발의 정석' 389page에 나오는 코드를 따라하다가 발견하게 되었다.
생성자에서 WidgetComponent에 UserWidget을 로드해서 저장해두었다.
static ConstructorHelpers::FClassFinder<UUserWidget> UI_HUD(TEXT("WidgetBlueprint'/Game/Book/UI/UI_HPBar.UI_HPBar_C'"));
if (UI_HUD.Succeeded())
{
HPBarWidget->SetWidgetClass(UI_HUD.Class);
HPBarWidget->SetDrawSize(FVector2D(150.0f, 50.0f));
}
UserWidget을 받아와서 원하는 클래스로 Cast하려니, Cast가 정상적으로 작동하지 않는다.
void AABCharacter::PostInitializeComponents()
{
UABCharacterWidget* CharacterWidget = Cast<UABCharacterWidget>(HPBarWidget->GetUserWidgetObject());
if (nullptr != CharacterWidget) // nullptr 뜸.
{
CharacterWidget->BindCharacterStat(CharacterStat);
}
}
해결
GetUserWidgetObject()를 호출하기 전에, InitWidget()을 호출한다.
HPBarWidget->InitWidget();
UABCharacterWidget* CharacterWidget = Cast<UABCharacterWidget>(HPBarWidget->GetUserWidgetObject());
if (nullptr != CharacterWidget)
{
CharacterWidget->BindCharacterStat(CharacterStat);
}
+ 추가
2023.03.28.
언리얼 4.15에서 4.26으로 프로젝트 업그레이드를 진행하면서, Blueprint에서도 이런 오류가 났다.
Blueprint에서는 InitWidget에 접근할 수 없어서 막막했는데, 그냥 Construction Script의 내용을 Begin Play로 옮겨서 해결했다. 나중에 문제가 생길 수도 있긴한데... 음... 완벽한 해결법은 모르겠다.