IsLoadingFromScene via static flag, revert network replication on SpawnableComponent

- IsLoadingFromScene uses a simple static bool flag active during spawn loop
- Works server-side only (client relies on its own property replication)
- Removed replicated bLoadedFromScene/bPropertiesReady from SpawnableComponent
- Removed Multicast RPC and SetIsReplicatedByDefault (unnecessary complexity)
- SceneSerializer sets bIsCurrentlyLoading during load for consistent behavior

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-14 13:36:12 +02:00
parent 1d5d448bf1
commit 5affbc7d0d
3 changed files with 13 additions and 10 deletions

View File

@@ -89,6 +89,7 @@ bool UPS_Editor_SceneLoader::LoadSceneFromData(UWorld* World, const FPS_Editor_S
int32 SpawnedCount = 0;
bIsCurrentlyLoading = true;
for (const FPS_Editor_ActorData& ActorData : SceneData.Actors)
{
AActor* SpawnedActor = SpawnActorFromData(World, ActorData);
@@ -98,6 +99,7 @@ bool UPS_Editor_SceneLoader::LoadSceneFromData(UWorld* World, const FPS_Editor_S
SpawnedCount++;
}
}
bIsCurrentlyLoading = false;
UE_LOG(LogTemp, Log, TEXT("PS_Editor SceneLoader: Loaded %d actors from scene '%s'"),
SpawnedCount, *SceneData.SceneName);
@@ -118,13 +120,8 @@ AActor* UPS_Editor_SceneLoader::SpawnActorFromData(UWorld* World, const FPS_Edit
return nullptr;
}
// Spawn with tag set BEFORE BeginPlay so the BP can skip its default init
FActorSpawnParameters SpawnParams;
SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;
SpawnParams.CustomPreSpawnInitalization = [](AActor* Actor)
{
Actor->Tags.Add(FName("PS_Editor_Loading"));
};
AActor* SpawnedActor = World->SpawnActor<AActor>(LoadedClass, ActorData.Location, ActorData.Rotation, SpawnParams);
if (!SpawnedActor)
@@ -152,9 +149,6 @@ AActor* UPS_Editor_SceneLoader::SpawnActorFromData(UWorld* World, const FPS_Edit
Spline->ImportFromCustomProperties(ActorData.CustomProperties);
}
// Remove loading tag now that properties are applied
SpawnedActor->Tags.Remove(FName("PS_Editor_Loading"));
// Notify the actor that all properties are ready
if (SpawnedActor->GetClass()->ImplementsInterface(UPS_Editor_EditableInterface::StaticClass()))
{
@@ -209,9 +203,11 @@ void UPS_Editor_SceneLoader::ApplyCustomProperties(AActor* Actor, const TMap<FSt
}
}
bool UPS_Editor_SceneLoader::bIsCurrentlyLoading = false;
bool UPS_Editor_SceneLoader::IsLoadingFromScene(const AActor* Actor)
{
return Actor && Actor->ActorHasTag(FName("PS_Editor_Loading"));
return bIsCurrentlyLoading;
}
FString UPS_Editor_SceneLoader::GetScenesDirectory()

View File

@@ -71,12 +71,15 @@ public:
static FString GetSceneLevelName(const FString& SceneName);
/**
* Returns true if this actor is currently being spawned from a scene load.
* Returns true while a scene is being loaded (actors are being spawned from JSON).
* Use in BeginPlay to skip default initialization — wait for OnPropertiesLoaded instead.
*/
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "PS Editor")
static bool IsLoadingFromScene(const AActor* Actor);
/** Static flag: true while SceneLoader or SceneSerializer is spawning actors. */
static bool bIsCurrentlyLoading;
/**
* Get all saved scenes for the current level.
*/

View File

@@ -4,6 +4,7 @@
#include "PS_Editor_EditableComponent.h"
#include "PS_Editor_EditableInterface.h"
#include "PS_Editor_PlayerController.h"
#include "PS_Editor_SceneLoader.h"
#include "PS_Editor_SplineActor.h"
#include "JsonObjectConverter.h"
#include "Misc/FileHelper.h"
@@ -150,6 +151,7 @@ bool UPS_Editor_SceneSerializer::LoadScene(const FString& SceneName, UPS_Editor_
// Re-spawn actors from saved data
int32 SpawnedCount = 0;
UPS_Editor_SceneLoader::bIsCurrentlyLoading = true;
for (const FPS_Editor_ActorData& ActorData : SceneData.Actors)
{
UClass* LoadedClass = LoadObject<UClass>(nullptr, *ActorData.ClassPath);
@@ -228,6 +230,8 @@ bool UPS_Editor_SceneSerializer::LoadScene(const FString& SceneName, UPS_Editor_
}
}
UPS_Editor_SceneLoader::bIsCurrentlyLoading = false;
UE_LOG(LogTemp, Log, TEXT("PS_Editor: Scene loaded: %s (%d actors)"), *SceneName, SpawnedCount);
return true;
}