Проблема#
Недавно я заметил странное поведение: не все реплицируемые акторы, размещённые на карте, вызывают BeginPlay на клиенте.
При расследовании выяснилось, что в Unreal Engine 5.7 был добавлен код, задерживающий вызов BeginPlay для акторов, заспавненных через SpawnActor(...). Побочным эффектом стало то, что эта логика начала затрагивать и акторы, размещённые на уровне. В зависимости от порядка репликации часть из них могла не получить BeginPlay.
Причина и исправление#
Проблема была внесена в коммите (26 июня 2025),
и исправлена в коммите (примерно 2 недели назад).
Исправление устраняет ситуацию, при которой статические акторы ошибочно помечались как ActorIsPendingPostNetInit.
Текущее состояние#
Пока фикс не попал в релиз Unreal Engine, ниже приведено небольшое временное решение, позволяющее избежать этой проблемы.
[/Script/Engine.Engine]
WorldSettingsClassName=/Script/TheGame.TheGameWorldSettings
UCLASS()
class ATheGameWorldSettings : public AWorldSettings
{
GENERATED_BODY()
public:
void NotifyBeginPlay() override;
};
#include "Runtime/Launch/Resources/Version.h"
#include "EngineUtils.h"
void ATheGameWorldSettings::NotifyBeginPlay()
{
#if ENGINE_MAJOR_VERSION == 5 && ENGINE_MINOR_VERSION == 7
UWorld* World = GetWorld();
if (!World->GetBegunPlay())
for (FActorIterator It(World); It; ++It)
if (It->IsFullNameStableForNetworking())
It->SetActorIsPendingPostNetInit(false);
#else
#error Read and Check commet below
// There is a regression in Iris replication that can prevent some replicated actors
// from receiving BeginPlay on clients (actors may remain in PendingPostNetInit state).
//
// The regression was introduced by Epic in commit:
// https://github.com/EpicGames/UnrealEngine/commit/6796445b2fe87a50f253a770366c0a2631de3dbe
//
// And fixed later in commit:
// https://github.com/EpicGames/UnrealEngine/commit/ee50eb17d588f27536209620ed2c44b0b666f39a
//
// This version check is used to apply a workaround only for engine versions
// where the fix is not yet present.
#endif
Super::NotifyBeginPlay();
}
