// Copyright Epic Games, Inc. All Rights Reserved. #include "GameUIManagerSubsystem.h" #include "Containers/Array.h" #include "Engine/GameInstance.h" #include "GameUIPolicy.h" #include "Misc/AssertionMacros.h" #include "Templates/Casts.h" #include "Templates/SubclassOf.h" #include "UObject/Object.h" #include "UObject/UObjectHash.h" class FSubsystemCollectionBase; class UClass; void UGameUIManagerSubsystem::Initialize(FSubsystemCollectionBase& Collection) { Super::Initialize(Collection); if (!CurrentPolicy && !DefaultUIPolicyClass.IsNull()) { TSubclassOf PolicyClass = DefaultUIPolicyClass.LoadSynchronous(); SwitchToPolicy(NewObject(this, PolicyClass)); } } void UGameUIManagerSubsystem::Deinitialize() { Super::Deinitialize(); SwitchToPolicy(nullptr); } bool UGameUIManagerSubsystem::ShouldCreateSubsystem(UObject* Outer) const { if (!CastChecked(Outer)->IsDedicatedServerInstance()) { TArray ChildClasses; GetDerivedClasses(GetClass(), ChildClasses, false); // Only create an instance if there is no override implementation defined elsewhere return ChildClasses.Num() == 0; } return false; } void UGameUIManagerSubsystem::NotifyPlayerAdded(UCommonLocalPlayer* LocalPlayer) { if (ensure(LocalPlayer) && CurrentPolicy) { CurrentPolicy->NotifyPlayerAdded(LocalPlayer); } } void UGameUIManagerSubsystem::NotifyPlayerRemoved(UCommonLocalPlayer* LocalPlayer) { if (LocalPlayer && CurrentPolicy) { CurrentPolicy->NotifyPlayerRemoved(LocalPlayer); } } void UGameUIManagerSubsystem::NotifyPlayerDestroyed(UCommonLocalPlayer* LocalPlayer) { if (LocalPlayer && CurrentPolicy) { CurrentPolicy->NotifyPlayerDestroyed(LocalPlayer); } } void UGameUIManagerSubsystem::SwitchToPolicy(UGameUIPolicy* InPolicy) { if (CurrentPolicy != InPolicy) { CurrentPolicy = InPolicy; } }