UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SubsystemCollection.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Templates/Casts.h"
7#include "UObject/GCObject.h"
8
9class USubsystem;
11
13
15{
16public:
19
20 /* Clears the collection, while deinitializing the systems */
22
24 bool IsInitialized() const { return Outer != nullptr; }
25
27 const UClass* GetBaseType() const { return BaseType; }
28
34
39 template <typename TSubsystemClass>
41 {
42 return Cast<TSubsystemClass>(InitializeDependency(TSubsystemClass::StaticClass()));
43 }
44
49
54
56 ENGINE_API void AddReferencedObjects(UObject* Referencer, FReferenceCollector& Collector);
57protected:
59 {
61 mutable bool bIsIterating = false; // Safety check to avoid removals during iteration but allow index-based iteration
62 };
63
66
69
72
75
76 // Fetch a list of subsystems that derive from the given class, populating the cache if necessary
78
81
87 ENGINE_API void ForEachSubsystem(TFunctionRef<void(USubsystem*)> Operation) const;
88
91
94
95private:
96 ENGINE_API USubsystem* AddAndInitializeSubsystem(UClass* SubsystemClass);
97
98 ENGINE_API void RemoveAndDeinitializeSubsystem(USubsystem* Subsystem);
99
101
102 mutable TMap<UClass*, TUniquePtr<FSubsystemArray>> SubsystemArrayMap;
103
104 UClass* BaseType;
105
106 UObject* Outer;
107
108 bool bPopulating;
109 mutable bool bIterating = false; // True if iterating over SubsystemMap
110
111 FDelegateHandle ModulesUnloadedHandle;
112
113private:
115
117 static ENGINE_API void AddAllInstances(UClass* SubsystemClass);
118
120 static ENGINE_API void RemoveAllInstances(UClass* SubsystemClass);
121};
122
123template<typename TBaseType>
125{
126public:
128 template <typename TSubsystemClass>
130 {
131 static_assert(TIsDerivedFrom<TSubsystemClass, TBaseType>::IsDerived, "TSubsystemClass must be derived from TBaseType");
132
133 // A static cast is safe here because we know SubsystemClass derives from TSubsystemClass if it is not null
135 }
136
138 template <typename TSubsystemClass>
140 {
141 // Force a compile time check that TSubsystemClass derives from TBaseType, the internal code only enforces it's a USubsystem
143
145 return TArray<TSubsystemClass*>(reinterpret_cast<TSubsystemClass**>(Array.Subsystems.GetData()), Array.Subsystems.Num());
146 }
147
150 {
151 // Force a compile time check that TSubsystemClass derives from TBaseType, the internal code only enforces it's a USubsystem
152 ForEachSubsystemOfClass(SubsystemClass , [Operation=MoveTemp(Operation)](USubsystem* Subsystem){
153 Operation(CastChecked<TBaseType>(Subsystem));
154 });
155 }
156
157 /* FGCObject Interface */
158 virtual void AddReferencedObjects(FReferenceCollector& Collector) override
159 {
161 }
162
163 virtual FString GetReferencerName() const override
164 {
165 return TEXT("FSubsystemCollection");
166 }
167
168public:
169
175};
176
178template<typename TBaseType>
180{
181public:
183 template <typename TSubsystemClass>
185 {
186 static_assert(TIsDerivedFrom<TSubsystemClass, TBaseType>::IsDerived, "TSubsystemClass must be derived from TBaseType");
187
188 // A static cast is safe here because we know SubsystemClass derives from TSubsystemClass if it is not null
190 }
191
193 template <typename TSubsystemClass>
195 {
196 // Force a compile time check that TSubsystemClass derives from TBaseType, the internal code only enforces it's a USubsystem
198
200 return TArray<TSubsystemClass*>(reinterpret_cast<TSubsystemClass**>(Array.Subsystems.GetData()), Array.Subsystems.Num());
201 }
202
205 {
206 ForEachSubsystemOfClass(SubsystemClass, [Operation=MoveTemp(Operation)](USubsystem* Subsystem){
207 Operation(CastChecked<TBaseType>(Subsystem));
208 });
209 }
210
211 template <typename TSubsystemInterface>
213 {
214 UClass* SubsystemInterfaceClass = TSubsystemInterface::StaticClass();
215 ForEachSubsystemOfClass(SubsystemInterfaceClass, [Operation = MoveTemp(Operation)](USubsystem* Subsystem)
216 {
217 Operation(CastChecked<TBaseType>(Subsystem));
218 });
219 }
220
221public:
222
228};
229
#define TEXT(x)
Definition Platform.h:1272
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define DECLARE_LOG_CATEGORY_EXTERN(CategoryName, DefaultVerbosity, CompileTimeVerbosity)
Definition LogMacros.h:361
UClass * StaticClass()
Definition ReflectedTypeAccessors.h:13
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition IDelegateInstance.h:14
Definition GCObject.h:128
Definition SubsystemCollection.h:180
FObjectSubsystemCollection()
Definition SubsystemCollection.h:224
void ForEachSubsystemWithInterface(TFunctionRef< void(TBaseType *)> Operation) const
Definition SubsystemCollection.h:212
TArray< TSubsystemClass * > GetSubsystemArrayCopy(const TSubclassOf< TSubsystemClass > &SubsystemClass) const
Definition SubsystemCollection.h:194
void ForEachSubsystem(TFunctionRef< void(TBaseType *)> Operation, const TSubclassOf< TBaseType > &SubsystemClass={}) const
Definition SubsystemCollection.h:204
TSubsystemClass * GetSubsystem(const TSubclassOf< TSubsystemClass > &SubsystemClass) const
Definition SubsystemCollection.h:184
Definition UObjectGlobals.h:2492
Definition SubsystemCollection.h:15
TSubsystemClass * InitializeDependency()
Definition SubsystemCollection.h:40
virtual ENGINE_API ~FSubsystemCollectionBase()
Definition SubsystemCollection.cpp:225
ENGINE_API USubsystem * GetSubsystemInternal(UClass *SubsystemClass) const
Definition SubsystemCollection.cpp:50
static ENGINE_API void ActivateExternalSubsystem(UClass *SubsystemClass)
Definition SubsystemCollection.cpp:401
ENGINE_API void ForEachSubsystemOfClass(UClass *SubsystemClass, TFunctionRef< void(USubsystem *)> Operation) const
Definition SubsystemCollection.cpp:121
static ENGINE_API void DeactivateExternalSubsystem(UClass *SubsystemClass)
Definition SubsystemCollection.cpp:406
ENGINE_API void Deinitialize()
Definition SubsystemCollection.cpp:239
bool IsInitialized() const
Definition SubsystemCollection.h:24
ENGINE_API void ForEachSubsystem(TFunctionRef< void(USubsystem *)> Operation) const
Definition SubsystemCollection.cpp:90
ENGINE_API void RemoveSubsystemsInPackages(TConstArrayView< UPackage * > Packages)
Definition SubsystemCollection.cpp:137
ENGINE_API FSubsystemArray & FindAndPopulateSubsystemArrayInternal(UClass *SubsystemClass) const
Definition SubsystemCollection.cpp:99
const UClass * GetBaseType() const
Definition SubsystemCollection.h:27
ENGINE_API TArray< USubsystem * > GetSubsystemArrayCopy(UClass *SubsystemClass) const
Definition SubsystemCollection.cpp:84
ENGINE_API void AddReferencedObjects(UObject *Referencer, FReferenceCollector &Collector)
Definition SubsystemCollection.cpp:306
ENGINE_API FSubsystemCollectionBase()
Definition SubsystemCollection.cpp:36
Definition SubsystemCollection.h:125
virtual FString GetReferencerName() const override
Definition SubsystemCollection.h:163
TSubsystemClass * GetSubsystem(const TSubclassOf< TSubsystemClass > &SubsystemClass) const
Definition SubsystemCollection.h:129
virtual void AddReferencedObjects(FReferenceCollector &Collector) override
Definition SubsystemCollection.h:158
TArray< TSubsystemClass * > GetSubsystemArrayCopy(const TSubclassOf< TSubsystemClass > &SubsystemClass) const
Definition SubsystemCollection.h:139
void ForEachSubsystem(TFunctionRef< void(TBaseType *)> Operation, const TSubclassOf< TBaseType > &SubsystemClass={}) const
Definition SubsystemCollection.h:149
FSubsystemCollection()
Definition SubsystemCollection.h:171
Definition SubsystemCollection.cpp:16
Definition Array.h:670
Definition AssetRegistryState.h:50
Definition UnrealString.h.inl:34
Definition SubclassOf.h:30
Definition Class.h:3793
Definition Subsystem.h:88
Definition Object.h:95
Definition Subsystem.h:48
Definition SubsystemCollection.h:59
TArray< USubsystem * > Subsystems
Definition SubsystemCollection.h:60
bool bIsIterating
Definition SubsystemCollection.h:61
Definition UnrealTypeTraits.h:40
Definition ObjectPtr.h:488