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로 옮겨서 해결했다. 나중에 문제가 생길 수도 있긴한데... 음... 완벽한 해결법은 모르겠다.