I confirm it works well with GetWorld SpawnActor.
Here is the revised code:
// TODO: Consider using WorldSubsystem
// Called when the game starts or when spawned
void ASpawnerSupervisor::BeginPlay()
{
Super::BeginPlay();
// Clear singleton
ASpawnerSupervisor::ASSp_SpawnerSupervisor = nullptr;
// Reset singleton
GetSS();
ASSSLM1p_SpawnerSpaceShipLegionMark1 = Cast<ASpawnerSpaceShipLegionMark1>(OnDemandSpawn(ASpawnerSpaceShipLegionMark1::StaticClass()));
ASPUHp_SpawnerPowerUpHeal = Cast<ASpawnerPowerUpHeal>(OnDemandSpawn(ASpawnerPowerUpHeal::StaticClass()));
ASPUCWp_SpawnerPowerUpChangeWeapon = Cast<ASpawnerPowerUpChangeWeapon>(OnDemandSpawn(ASpawnerPowerUpChangeWeapon::StaticClass()));
ASPUHp_SpawnerPowerUpHeal->ScheduledSpawn();
ASPUCWp_SpawnerPowerUpChangeWeapon->ScheduledSpawn();
}
AActor* ASpawnerSupervisor::OnDemandSpawn(TSubclassOf<AActor> TSOAAv_ActorClass)
{
if (TSOAAv_ActorClass)
{
FTransform FTv_SpawnTransform;
FActorSpawnParameters FASPv_SpawnParams;
FASPv_SpawnParams.Owner = this;
FASPv_SpawnParams.Instigator = GetInstigator();
AActor* AAp_SpawnedActor = GetWorld()->SpawnActor<AActor>(TSOAAv_ActorClass, FTv_SpawnTransform, FASPv_SpawnParams);
if (AAp_SpawnedActor)
{
return AAp_SpawnedActor;
}
else
{
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("AAp_SpawnedActor not spawned"));
return nullptr;
}
}
else
{
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("AAp_SpawnedActor not set!"));
}
return nullptr;
}