UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MassSubsystemAccess.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "MassEntityTypes.h"
6#include "MassRequirements.h"
11#include "Engine/LocalPlayer.h"
12#include "Engine/GameInstance.h"
13
14#if WITH_EDITOR
15#include "Editor.h"
16#include "EditorSubsystem.h"
17#else
18#include "Engine/Engine.h"
19#endif // WITH_EDITOR
20
21
23{
25
26 //-----------------------------------------------------------------------------
27 // Statically-typed subsystems
28 //-----------------------------------------------------------------------------
31 {
32 const uint32 SystemIndex = FMassExternalSubsystemBitSet::GetTypeIndex<T>();
34 , TEXT("Missing 'template<> struct TMassExternalSubsystemTraits<U%s>' for this subsystem"), *GetNameSafe(T::StaticClass())))
35 {
37 }
38
39 return nullptr;
40 }
41
44 {
45 T* InstancePtr = GetMutableSubsystem<T>();
46 check(InstancePtr);
47 return *InstancePtr;
48 }
49
51 const T* GetSubsystem()
52 {
53 const uint32 SystemIndex = FMassExternalSubsystemBitSet::GetTypeIndex<T>();
55 , TEXT("Missing 'template<> struct TMassExternalSubsystemTraits<U%s>' for this subsystem"), *GetNameSafe(T::StaticClass())))
56 {
58 }
59 return nullptr;
60 }
61
64 {
65 const T* InstancePtr = GetSubsystem<T>();
66 check(InstancePtr);
67 return *InstancePtr;
68 }
69
70 //-----------------------------------------------------------------------------
71 // UClass-provided subsystems
72 //-----------------------------------------------------------------------------
75 {
76 const uint32 SystemIndex = FMassExternalSubsystemBitSet::GetTypeIndex(**SubsystemClass);
78 , TEXT("Missing 'template<> struct TMassExternalSubsystemTraits<U%s>' for this subsystem"), *GetNameSafe(SubsystemClass)))
79 {
81 }
82
83 return nullptr;
84 }
85
88 {
89 T* InstancePtr = GetMutableSubsystem<T>(SubsystemClass);
90 check(InstancePtr);
91 return *InstancePtr;
92 }
93
96 {
97 const uint32 SystemIndex = FMassExternalSubsystemBitSet::GetTypeIndex(**SubsystemClass);
99 , TEXT("Missing 'template<> struct TMassExternalSubsystemTraits<U%s>' for this subsystem"), *GetNameSafe(SubsystemClass)))
100 {
102 }
103 return nullptr;
104 }
105
108 {
109 const T* InstancePtr = GetSubsystem<T>(SubsystemClass);
110 check(InstancePtr);
111 return *InstancePtr;
112 }
113
114 //-----------------------------------------------------------------------------
115 // remaining API
116 //-----------------------------------------------------------------------------
119
125
131
132 template<typename T>
141
144 {
145 check(World);
147 {
148 return UWorld::GetSubsystem<T>(World);
149 }
151 {
152 return UGameInstance::GetSubsystem<T>(World->GetGameInstance());
153 }
155 {
156 // note that this default implementation will work only for the first player in a local-coop game
157 // to customize this behavior specialize the FetchSubsystemInstance template function for the type you need.
158 return ULocalPlayer::GetSubsystem<T>(World->GetFirstLocalPlayerFromController());
159 }
160 else
161 {
162 checkf(false, TEXT("FMassSubsystemAccess::FetchSubsystemInstance: Unhandled world-related USubsystem class %s"), *T::StaticClass()->GetName());
163 }
164 }
165
168 {
170 {
171 return GEngine->GetEngineSubsystem<T>();
172 }
173#if WITH_EDITOR
175 {
176 return GEditor->GetEditorSubsystem<T>();
177 }
178#endif // WITH_EDITOR
179 else
180 {
181 checkf(false, TEXT("FMassSubsystemAccess::FetchSubsystemInstance: Unhandled world-less USubsystem class %s"), *T::StaticClass()->GetName());
182 }
183 }
184
186
187protected:
188 template<typename T>
211
212 template<typename T>
228
230
235};
#define check(expr)
Definition AssertionMacros.h:314
#define ensureMsgf( InExpression, InFormat,...)
Definition AssertionMacros.h:465
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
ENGINE_API class UEngine * GEngine
Definition UnrealEngine.cpp:427
FString GetNameSafe(const FField *InField)
Definition Field.h:1230
#define TEXT(x)
Definition Platform.h:1272
#define UNLIKELY(x)
Definition Platform.h:857
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT bool IsValidIndex(SizeType Index) const
Definition Array.h:1122
SizeType AddZeroed()
Definition Array.h:2755
Definition SubclassOf.h:30
TSubsystemClass * GetEngineSubsystem() const
Definition Engine.h:3779
Definition Subsystem.h:48
Definition World.h:918
UGameInstance * GetGameInstance() const
Definition World.h:4270
T * GetFirstLocalPlayerFromController() const
Definition World.h:2686
Definition MassSubsystemAccess.h:23
T * GetMutableSubsystem(const TSubclassOf< USubsystem > SubsystemClass)
Definition MassSubsystemAccess.h:74
MASSENTITY_API bool CacheSubsystemRequirements(const FMassSubsystemRequirements &SubsystemRequirements)
Definition MassSubsystemAccess.cpp:61
TWeakObjectPtr< UWorld > World
Definition MassSubsystemAccess.h:234
void SetSubsystemRequirementBits(const FMassExternalSubsystemBitSet &InConstSubsystemsBitSet, const FMassExternalSubsystemBitSet &InMutableSubsystemsBitSet)
Definition MassSubsystemAccess.h:126
TArray< USubsystem * > Subsystems
Definition MassSubsystemAccess.h:233
const T * GetSubsystem()
Definition MassSubsystemAccess.h:51
const T & GetSubsystemChecked()
Definition MassSubsystemAccess.h:63
MASSENTITY_API void SetSubsystemRequirements(const FMassSubsystemRequirements &SubsystemRequirements)
Definition MassSubsystemAccess.cpp:115
void GetSubsystemRequirementBits(FMassExternalSubsystemBitSet &OutConstSubsystemsBitSet, FMassExternalSubsystemBitSet &OutMutableSubsystemsBitSet)
Definition MassSubsystemAccess.h:120
T * GetMutableSubsystem()
Definition MassSubsystemAccess.h:30
static constexpr bool DoesRequireWorld()
Definition MassSubsystemAccess.h:133
T * GetSubsystemInternal(const uint32 SystemIndex, const TSubclassOf< USubsystem > SubsystemClass)
Definition MassSubsystemAccess.h:213
const T & GetSubsystemChecked(const TSubclassOf< USubsystem > SubsystemClass)
Definition MassSubsystemAccess.h:107
static T * FetchSubsystemInstance()
Definition MassSubsystemAccess.h:167
MASSENTITY_API bool CacheSubsystem(const uint32 SystemIndex)
Definition MassSubsystemAccess.cpp:87
FMassExternalSubsystemBitSet ConstSubsystemsBitSet
Definition MassSubsystemAccess.h:231
FMassExternalSubsystemBitSet MutableSubsystemsBitSet
Definition MassSubsystemAccess.h:232
static T * FetchSubsystemInstance(UWorld *World)
Definition MassSubsystemAccess.h:143
const T * GetSubsystem(const TSubclassOf< USubsystem > SubsystemClass)
Definition MassSubsystemAccess.h:95
T & GetMutableSubsystemChecked()
Definition MassSubsystemAccess.h:43
T & GetMutableSubsystemChecked(const TSubclassOf< USubsystem > SubsystemClass)
Definition MassSubsystemAccess.h:87
T * GetSubsystemInternal(const uint32 SystemIndex)
Definition MassSubsystemAccess.h:189
Definition MassRequirements.h:72
Definition UnrealTypeTraits.h:40
Definition WeakObjectPtrTemplates.h:25
FORCEINLINE T * Get(bool bEvenIfPendingKill) const
Definition WeakObjectPtrTemplates.h:132