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)
 

Private 속성

TMap< TSubclassOf< AActor >, FObjectPoolObjectPools
 

멤버 함수 문서화

◆ CreateActorAndSetup()

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

◆ GetActorFromPool()

AActor * UPoolWorldSubsystem::GetActorFromPool ( TSubclassOf< AActor >  ActorClass,
FVector  Location,
FRotator  Rotation 
)
69{
70 if (!ActorClass || !GetWorld())
71 {
72 return nullptr;
73 }
74
75 FObjectPool* Pool = ObjectPools.Find(ActorClass);
76 AActor* SpawnedActor = nullptr;
77
78 while (Pool && Pool->InactiveActors.Num() > 0)
79 {
80 SpawnedActor = Pool->InactiveActors.Pop();
81 if (IsValid(SpawnedActor))
82 {
83 break;
84 }
85 SpawnedActor = nullptr;
86 }
87
88 if (!SpawnedActor)
89 {
90 const UObjectPoolSettings* Settings = GetDefault<UObjectPoolSettings>();
91 bool bCanExpand = true;
92
93 if (Settings && Settings->PoolMaps.Contains(ActorClass))
94 {
95 bCanExpand = Settings->PoolMaps[ActorClass].bCanExpand;
96 }
97
98 if (bCanExpand)
99 {
100 SpawnedActor = CreateActorAndSetup(ActorClass, GetWorld());
101 }
102 else
103 {
104 LOG_WARNING(LogCK, "%s 풀 부족으로 더 이상 스폰 불가능" , *ActorClass->GetName())
105 return nullptr;
106 }
107 }
108
109 if (SpawnedActor)
110 {
111 SpawnedActor->SetActorLocationAndRotation(Location, Rotation);
112 SpawnedActor->SetActorHiddenInGame(false);
113 SpawnedActor->SetActorTickEnabled(true);
114 SpawnedActor->SetActorEnableCollision(true);
115
116 if (SpawnedActor->Implements<UObjectPoolingInterface>())
117 {
118 IObjectPoolingInterface::Execute_OnSpawnFromPool(SpawnedActor);
119 }
120 }
121
122 return SpawnedActor;
123}
#define LOG_WARNING(Category, Format,...)
Definition CK_UE.h:31
Definition ObjectPoolSettings.h:27
TMap< TSubclassOf< AActor >, FPoolSettings > PoolMaps
Definition ObjectPoolSettings.h:32
TMap< TSubclassOf< AActor >, FObjectPool > ObjectPools
Definition PoolWorldSubsystem.h:38
AActor * CreateActorAndSetup(TSubclassOf< AActor > ActorClass, UWorld *World)
Definition PoolWorldSubsystem.cpp:44
Definition PoolWorldSubsystem.h:11
TArray< TObjectPtr< AActor > > InactiveActors
Definition PoolWorldSubsystem.h:16
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ OnWorldBeginPlay()

void UPoolWorldSubsystem::OnWorldBeginPlay ( UWorld &  InWorld)
overridevirtual
11{
12 Super::OnWorldBeginPlay(InWorld);
13
14 const UObjectPoolSettings* Settings = GetDefault<UObjectPoolSettings>();
15 if (!Settings)
16 {
17 return;
18 }
19
20 for (const auto& Pair : Settings->PoolMaps)
21 {
22 TSubclassOf<AActor> ActorClass = Pair.Key;
23 int32 InitialSize = Pair.Value.InitialPoolSize;
24
25 if (!ActorClass)
26 {
27 continue;
28 }
29
30
31 FObjectPool& NewPool = ObjectPools.FindOrAdd(ActorClass);
32
33 for (int32 i = 0; i < InitialSize; ++i)
34 {
35 AActor* NewActor = CreateActorAndSetup(ActorClass, &InWorld);
36 if (NewActor)
37 {
38 NewPool.InactiveActors.Add(NewActor);
39 }
40 }
41 }
42}
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ ReturnActorToPool()

void UPoolWorldSubsystem::ReturnActorToPool ( AActor *  ActorToReturn)
126{
127 if (!ActorToReturn || !GetWorld())
128 {
129 return;
130 }
131
132 UClass* ActorClass = ActorToReturn->GetClass();
133 FObjectPool& Pool = ObjectPools.FindOrAdd(ActorClass);
134
135 if (Pool.InactiveActors.Contains(ActorToReturn))
136 {
137 LOG_WARNING(LogCK, "이미 반환된 액터")
138 return;
139 }
140
141 if (ActorToReturn->Implements<UObjectPoolingInterface>())
142 {
143 IObjectPoolingInterface::Execute_OnReturnToPool(ActorToReturn);
144 }
145
146 // 비활성화
147 ActorToReturn->SetActorHiddenInGame(true);
148 ActorToReturn->SetActorEnableCollision(false);
149 ActorToReturn->SetActorTickEnabled(false);
150
151 Pool.InactiveActors.Add(ActorToReturn);
152}

멤버 데이터 문서화

◆ ObjectPools

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

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