AActor* UVREditorMode::SpawnTransientSceneActor(TSubclassOf<AActor> ActorClass, const FString& ActorName, const bool bWithSceneComponent) const { const bool bWasWorldPackageDirty = GetWorld()->GetOutermost()->IsDirty(); // @todo vreditor: Needs respawn if world changes (map load, etc.) Will that always restart the editor mode anyway? FActorSpawnParameters ActorSpawnParameters; ActorSpawnParameters.Name = MakeUniqueObjectName( GetWorld(), ActorClass, *ActorName ); // @todo vreditor: Without this, SpawnActor() can return us an existing PendingKill actor of the same name! WTF? ActorSpawnParameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; ActorSpawnParameters.ObjectFlags = EObjectFlags::RF_Transient; check( ActorClass != nullptr ); AActor* NewActor = GetWorld()->SpawnActor< AActor >( ActorClass, ActorSpawnParameters ); NewActor->SetActorLabel( ActorName ); if( bWithSceneComponent ) { // Give the new actor a root scene component, so we can attach multiple sibling components to it USceneComponent* SceneComponent = NewObject<USceneComponent>( NewActor ); NewActor->AddOwnedComponent( SceneComponent ); NewActor->SetRootComponent( SceneComponent ); SceneComponent->RegisterComponent(); } // Don't dirty the level file after spawning a transient actor if( !bWasWorldPackageDirty ) { GetWorld()->GetOutermost()->SetDirtyFlag( false ); } return NewActor; }