Перейти к основному содержимому
Iris Replication: Проблема с BeginPlay в Unreal Engine 5.7

Iris Replication: Проблема с BeginPlay в Unreal Engine 5.7

·238 слов·2 минут
Iris - Эта статья является частью серии.
Часть 4: Эта статья

Проблема
#

Недавно я заметил странное поведение: не все реплицируемые акторы, размещённые на карте, вызывают 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();
}
Iris - Эта статья является частью серии.
Часть 4: Эта статья