SetRootComponent directly after Spawn

Attempt

I try to switch the RootComponent directly after spawning an Actor:

void ASpawner::BeginPlay()
{
	Super::BeginPlay();

	//Spawn
	UWorld* World = GetWorld();
	FActorSpawnParameters SpawnInfo;
	SpawnInfo.Owner = GetOwner();
	SpawnInfo.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
	AActor* SpawnedActor = World->SpawnActor<AActor>(SpawnedClass, SpawnInfo);

	//Get attached Component
	UActorComponent* FoundComponent = SpawnedActor->GetComponentByClass(UPrimitiveComponent::StaticClass());
	UPrimitiveComponent* CastComponent = Cast<UPrimitiveComponent>(FoundComponent);

	//Set as Root
	SpawnedActor->SetRootComponent(CastComponent);
}

The spawned ActorBlueprint looks like this:

278438-spawned.jpg

Problem

I get the error message:
Ensure condition failed: ParentActor != ActorPtr …
Encountered an Actor attached to itself

Question

Is this a bug or do I need to register the Actor/Component/etc.?

I think you should set the RootComponent only in the actor’s constructor.

Also it’s not good at all to access an actor’s components from another actors.

There is a way to make some setup for a spawning actor before spawn is completed, look hee for the upvoted answer. Though I’m sure it’s still not the way to setup the actor’s component. In most cases, components should be created in the actor’s constructor.

Interesting, that function was new to me.

Using it doesn’t trigger the ensure condition anymore, SetRootComponent returns a bool to indicate success, but it doesn’t do anything.

I know that it is bad practice to modify unknown Actors from outside. The reason I require this functionality is actually to autocorrect mistakes that inexperienced designers may make when choosing certain configurations. Since the projects are usually short-lived, it is easier to throw a warning and try to guess what the intention of the designer was.

Unfortunately, I don’t know how I could validate that SetRootComponent will crash by using Unreal’s functionality and checking for certain conditions doesn’t work since the involved entities don’t know about each other.