Payback 0.0.1
CK Graduation Project
로딩중...
검색중...
일치하는것 없음
UPoolWorldSubsystem 클래스 참조

#include <PoolWorldSubsystem.h>

UPoolWorldSubsystem에 대한 상속 다이어그램 :
Inheritance graph
UPoolWorldSubsystem에 대한 협력 다이어그램:
Collaboration graph

Public 멤버 함수

virtual void OnWorldBeginPlay (UWorld &InWorld) override
 
AActor * GetActorFromPool (TSubclassOf< AActor > ActorClass, FVector Location, FRotator Rotation)
 
void ReturnActorToPool (AActor *ActorToReturn)
 

Private 멤버 함수

AActor * CreateActorAndSetup (TSubclassOf< AActor > ActorClass, UWorld *World)
 
AActor * CreateActorFromPendingWarmup (TSubclassOf< AActor > ActorClass)
 
void QueuePoolWarmup (TSubclassOf< AActor > ActorClass, int32 ActorCount)
 
void ProcessPendingPoolWarmup ()
 
void ScheduleNextPoolWarmup ()
 

Private 속성

TMap< TSubclassOf< AActor >, FObjectPoolObjectPools
 
TArray< FPendingPoolWarmupPendingPoolWarmups
 
bool bIsPoolWarmupActive = false
 

멤버 함수 문서화

◆ CreateActorAndSetup()

AActor * UPoolWorldSubsystem::CreateActorAndSetup ( TSubclassOf< AActor >  ActorClass,
UWorld *  World 
)
private
42{
43 FActorSpawnParameters SpawnParams;
44 SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; // 위치 겹쳐도 강제 생성
45
46 AActor* SpawnedActor = World->SpawnActor<AActor>(ActorClass, FVector::ZeroVector, FRotator::ZeroRotator, SpawnParams);
47
48 if (SpawnedActor == nullptr)
49 {
50 return nullptr;
51 }
52
53 const FString FolderPath = FString::Printf(TEXT("ObjectPool/%s"), *ActorClass->GetName());
54
55#if WITH_EDITOR
56 SpawnedActor->SetFolderPath(FName(*FolderPath));
57#endif
58
59 if (SpawnedActor->Implements<UObjectPoolingInterface>())
60 {
61 IObjectPoolingInterface::Execute_OnReturnToPool(SpawnedActor);
62 }
63
64 SpawnedActor->SetActorHiddenInGame(true);
65 SpawnedActor->SetActorEnableCollision(false);
66 SpawnedActor->SetActorTickEnabled(false);
67 return SpawnedActor;
68}
Definition ObjectPoolingInterface.h:12
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ CreateActorFromPendingWarmup()

AActor * UPoolWorldSubsystem::CreateActorFromPendingWarmup ( TSubclassOf< AActor >  ActorClass)
private
72{
73 UWorld* World = GetWorld();
74
75 if (ActorClass == nullptr || World == nullptr)
76 {
77 return nullptr;
78 }
79
80 for (int32 Index = 0; Index < PendingPoolWarmups.Num(); ++Index)
81 {
82 FPendingPoolWarmup& PendingWarmup = PendingPoolWarmups[Index];
83
84 if (PendingWarmup.ActorClass != ActorClass || PendingWarmup.RemainingCount <= 0)
85 {
86 continue;
87 }
88
89 --PendingWarmup.RemainingCount;
90
91 if (FMath::Max(PendingWarmup.RemainingCount, 0) == 0)
92 {
93 PendingPoolWarmups.RemoveAt(Index);
94 }
95
96 return CreateActorAndSetup(ActorClass, World);
97 }
98
99 return nullptr;
100}
TArray< FPendingPoolWarmup > PendingPoolWarmups
Definition PoolWorldSubsystem.h:51
AActor * CreateActorAndSetup(TSubclassOf< AActor > ActorClass, UWorld *World)
Definition PoolWorldSubsystem.cpp:41
Definition PoolWorldSubsystem.h:20
int32 RemainingCount
Definition PoolWorldSubsystem.h:22
TSubclassOf< AActor > ActorClass
Definition PoolWorldSubsystem.h:21
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetActorFromPool()

AActor * UPoolWorldSubsystem::GetActorFromPool ( TSubclassOf< AActor >  ActorClass,
FVector  Location,
FRotator  Rotation 
)
204{
205 if (ActorClass == nullptr || GetWorld() == nullptr)
206 {
207 return nullptr;
208 }
209
210 FObjectPool* Pool = ObjectPools.Find(ActorClass);
211 AActor* SpawnedActor = nullptr;
212
213 while (Pool && Pool->InactiveActors.Num() > 0)
214 {
215 SpawnedActor = Pool->InactiveActors.Pop(EAllowShrinking::No);
216
217 if (IsValid(SpawnedActor))
218 {
219 break;
220 }
221
222 SpawnedActor = nullptr;
223 }
224
225 if (SpawnedActor == nullptr)
226 {
227 SpawnedActor = CreateActorFromPendingWarmup(ActorClass);
228 }
229
230 if (SpawnedActor == nullptr)
231 {
232 const UObjectPoolSettings* Settings = GetDefault<UObjectPoolSettings>();
233
234 bool bCanExpand = true;
235
236 if (Settings && Settings->PoolMaps.Contains(ActorClass))
237 {
238 bCanExpand = Settings->PoolMaps[ActorClass].bCanExpand;
239 }
240
241 if (bCanExpand)
242 {
243 SpawnedActor = CreateActorAndSetup(ActorClass, GetWorld());
244 }
245 else
246 {
247 LOG_WARNING(LogCK, "%s 풀 부족으로 더 이상 스폰 불가능", *ActorClass->GetName())
248 return nullptr;
249 }
250 }
251
252 if (SpawnedActor == nullptr)
253 {
254 return nullptr;
255 }
256
257 SpawnedActor->SetActorLocationAndRotation(Location, Rotation);
258 SpawnedActor->SetActorHiddenInGame(false);
259 SpawnedActor->SetActorTickEnabled(true);
260 SpawnedActor->SetActorEnableCollision(true);
261
262
263 if (SpawnedActor->Implements<UObjectPoolingInterface>())
264 {
265 IObjectPoolingInterface::Execute_OnSpawnFromPool(SpawnedActor);
266 }
267
268 return SpawnedActor;
269}
#define LOG_WARNING(Category, Format,...)
Definition CK_UE.h:39
Definition ObjectPoolSettings.h:27
TMap< TSubclassOf< AActor >, FPoolSettings > PoolMaps
Definition ObjectPoolSettings.h:41
AActor * CreateActorFromPendingWarmup(TSubclassOf< AActor > ActorClass)
Definition PoolWorldSubsystem.cpp:71
TMap< TSubclassOf< AActor >, FObjectPool > ObjectPools
Definition PoolWorldSubsystem.h:48
Definition PoolWorldSubsystem.h:11
TArray< TObjectPtr< AActor > > InactiveActors
Definition PoolWorldSubsystem.h:16
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnWorldBeginPlay()

void UPoolWorldSubsystem::OnWorldBeginPlay ( UWorld &  InWorld)
overridevirtual
14{
15 Super::OnWorldBeginPlay(InWorld);
16 const UObjectPoolSettings* Settings = GetDefault<UObjectPoolSettings>();
17
18 if (Settings == nullptr)
19 {
20 return;
21 }
22
23 for (const auto& Pair : Settings->PoolMaps)
24 {
25 TSubclassOf<AActor> ActorClass = Pair.Key;
26 int32 InitialSize = Pair.Value.InitialPoolSize;
27
28 if (ActorClass == nullptr || InitialSize <= 0)
29 {
30 continue;
31 }
32
33 ObjectPools.FindOrAdd(ActorClass);
34 QueuePoolWarmup(ActorClass, InitialSize);
35 }
36
38}
void ScheduleNextPoolWarmup()
Definition PoolWorldSubsystem.cpp:171
void QueuePoolWarmup(TSubclassOf< AActor > ActorClass, int32 ActorCount)
Definition PoolWorldSubsystem.cpp:103
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ ProcessPendingPoolWarmup()

void UPoolWorldSubsystem::ProcessPendingPoolWarmup ( )
private
117{
118 bIsPoolWarmupActive = false;
119
120 UWorld* World = GetWorld();
121
122 if (World == nullptr)
123 {
124 PendingPoolWarmups.Empty();
125 return;
126 }
127
128 int32 CreatedCount = 0;
129
130 const UObjectPoolSettings* Settings = GetDefault<UObjectPoolSettings>();
131
132 if (Settings == nullptr)
133 {
134 LOG_ERROR(LogCK, "%s를 찾지 못했습니다. ", NAMEOF(UObjectPoolSettings));
135 PendingPoolWarmups.Empty();
136 return;
137 }
138
139 while (CreatedCount < Settings->PoolWarmupActorsPerFrame && PendingPoolWarmups.Num() > 0)
140 {
141 FPendingPoolWarmup& PendingWarmup = PendingPoolWarmups[0];
142
143 if (PendingWarmup.ActorClass == nullptr || PendingWarmup.RemainingCount <= 0)
144 {
145 PendingPoolWarmups.RemoveAt(0);
146 continue;
147 }
148
149 FObjectPool& Pool = ObjectPools.FindOrAdd(PendingWarmup.ActorClass);
150
151 if (AActor* NewActor = CreateActorAndSetup(PendingWarmup.ActorClass, World))
152 {
153 Pool.InactiveActors.Add(NewActor);
154 }
155
156 --PendingWarmup.RemainingCount;
157 ++CreatedCount;
158
159 if (FMath::Max(PendingWarmup.RemainingCount, 0) > 0)
160 {
161 continue;
162 }
163
164 PendingPoolWarmups.RemoveAt(0);
165 }
166
168}
#define LOG_ERROR(Category, Format,...)
Definition CK_UE.h:40
#define NAMEOF(Type)
Definition CK_UE.h:30
bool bIsPoolWarmupActive
Definition PoolWorldSubsystem.h:52
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ QueuePoolWarmup()

void UPoolWorldSubsystem::QueuePoolWarmup ( TSubclassOf< AActor >  ActorClass,
int32  ActorCount 
)
private
104{
105 if (ActorClass == nullptr || ActorCount <= 0)
106 {
107 return;
108 }
109
110 FPendingPoolWarmup& PendingWarmup = PendingPoolWarmups.AddDefaulted_GetRef();
111 PendingWarmup.ActorClass = ActorClass;
112 PendingWarmup.RemainingCount = ActorCount;
113}
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ReturnActorToPool()

void UPoolWorldSubsystem::ReturnActorToPool ( AActor *  ActorToReturn)
273{
274 if (ActorToReturn == nullptr || GetWorld() == nullptr)
275 {
276 return;
277 }
278
279 UClass* ActorClass = ActorToReturn->GetClass();
280 FObjectPool& Pool = ObjectPools.FindOrAdd(ActorClass);
281
282 if (Pool.InactiveActors.Contains(ActorToReturn))
283 {
284 LOG_WARNING(LogCK, "이미 반환된 액터")
285 return;
286 }
287
288 if (ActorToReturn->Implements<UObjectPoolingInterface>())
289 {
290 IObjectPoolingInterface::Execute_OnReturnToPool(ActorToReturn);
291 }
292
293 // 비활성화
294 ActorToReturn->SetActorHiddenInGame(true);
295 ActorToReturn->SetActorEnableCollision(false);
296 ActorToReturn->SetActorTickEnabled(false);
297
298 Pool.InactiveActors.Add(ActorToReturn);
299}
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ScheduleNextPoolWarmup()

void UPoolWorldSubsystem::ScheduleNextPoolWarmup ( )
private
172{
173 if (bIsPoolWarmupActive || PendingPoolWarmups.Num() <= 0)
174 {
175 return;
176 }
177
178 const UWorld* World = GetWorld();
179
180 if (World == nullptr)
181 {
182 PendingPoolWarmups.Empty();
183 return;
184 }
185
186 bIsPoolWarmupActive = true;
187 TWeakObjectPtr<UPoolWorldSubsystem> WeakThis(this);
188
189 if (WeakThis.IsValid() == false)
190 {
191 return;
192 }
193
194 auto Lambda = [WeakThis]()
195 {
196 WeakThis->ProcessPendingPoolWarmup();
197 };
198
199 World->GetTimerManager().SetTimerForNextTick(Lambda);
200}
이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ bIsPoolWarmupActive

bool UPoolWorldSubsystem::bIsPoolWarmupActive = false
private

◆ ObjectPools

TMap<TSubclassOf<AActor>, FObjectPool> UPoolWorldSubsystem::ObjectPools
private

◆ PendingPoolWarmups

TArray<FPendingPoolWarmup> UPoolWorldSubsystem::PendingPoolWarmups
private

이 클래스에 대한 문서화 페이지는 다음의 파일들로부터 생성되었습니다.: