C++ Reference to Widget Component without Editor

Hello everyone.

I’m trying to add a Health Bar on one of my Actor class. I’ve made a Widget Blueprint and I want to give it to a Widget Component for my Actor, without having to pick up anything in the Editor (with UPROPERTY EditAnywhere and such), because I’m trying to keep my code as much… “code” as I can, even tho Blueprint is everywhere (which is REALLY annoying ).

void ASelectableActor::BeginPlay()
{
	Super::BeginPlay();
	UWidgetComponent* MyWidget = CreateDefaultSubobject<UWidgetComponent>("Widget");
	static ConstructorHelpers::FClassFinder<UUserWidget> MyWidgetClass(TEXT("/Game/HUD/SelectableActorHUD_Widget"));
	MyWidget->SetWidgetSpace(EWidgetSpace::Screen);
	MyWidget->SetWidgetClass(MyWidgetClass);
}

This is what I have tried so far, but of course, it doesn’t work. The error is on the last line :

Error (active) no suitable user-defined conversion from “ConstructorHelpers::FClassFinder” to “TSubclassOf” exists WarMomentum g:\Documents\Developpement UE4\WarMomentum\Source\WarMomentum\Actors\SelectableActor.cpp 28

Any idea how to do that ? That’s basic stuff but for some reasons UE4 is really clunky when it comes to C++…

Thanks !

FClassFinder dont automaticly converts to UClass*, FClassFinder has varable called Class which you need to use insted

So replace line 7 with this

MyWidget->SetWidgetClass(MyWidgetClass.Class);

Ok you were right, but doing as I did simply doesn’t work.

I’ve done this :

ASelectableActor::ASelectableActor()
{
	MyWidget = CreateDefaultSubobject<UWidgetComponent>("Widget");
	static ConstructorHelpers::FClassFinder<UUserWidget> hudWidgetObj(TEXT("/Game/HUD/SelectableActorHUD_Widget"));
	if (hudWidgetObj.Succeeded()) {
		hudWidgetClass = hudWidgetObj.Class;
	}
	else
	{
		GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Red, "SelectableActorHUD not found !");
		hudWidgetClass = nullptr;
	}
}

// Called when the game starts or when spawned
void ASelectableActor::BeginPlay()
{
	Super::BeginPlay();
	MyWidget->SetWidgetSpace(EWidgetSpace::World);
	MyWidget->SetWidgetClass(hudWidgetClass);
	MyWidget->SetVisibility(true);
	MyWidget->RegisterComponent();
}

And this compile, and I can see the Widget in the tree of my instances.
BUT, for some reasons, the component doesn’t show up, even thought I used MyWidget->SetVisibility(true); and MyWidget->RegisterComponent();

Any idea ?

I moved everything to the constructor and it’s working fine now.

// Sets default values
ASelectableActor::ASelectableActor()
{
	MyWidget = CreateDefaultSubobject<UWidgetComponent>("Widget");
	static ConstructorHelpers::FClassFinder<UUserWidget> hudWidgetObj(TEXT("/Game/HUD/SelectableActorHUD_Widget"));
	if (hudWidgetObj.Succeeded()) {
		hudWidgetClass = hudWidgetObj.Class;
	}
	else {
		GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Red, "SelectableActorHUD not found !");
		hudWidgetClass = nullptr;
	}
	MyWidget->SetWidgetSpace(EWidgetSpace::World);
	MyWidget->SetWidgetClass(hudWidgetClass);
	MyWidget->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f));
	MyWidget->SetDrawSize(FVector2D(100.0f, 20.0f));
	MyWidget->SetVisibility(true);
	MyWidget->RegisterComponent();

}
1 Like