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

#include <EnemySpawnDirectorSystemComponent.h>

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

Public 멤버 함수

 UEnemySpawnDirectorSystemComponent ()
 
virtual void Initialize (UStageManagementSubsystem *StageManagementSubsystem) override
 
virtual void ClearAll (const bool bClearSpawnedActors=true) override
 
virtual void CollectSpawnedTargetables (TArray< ITargetableInterface * > &OutTargetables) const override
 
virtual void TickComponent (float DeltaTime, ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction) override
 
void InitializeStandalone ()
 
void DeactivateAllSpawners ()
 
void ClearRegisteredSpawners ()
 
TArray< UEnemySpawnerComponent * > GetSpawners (ESpawnAreaID SpawnerID)
 
TArray< UEnemySpawnerComponent * > GetAllSpawners ()
 
void ActivateSpawners (const FWaveSpawnData &SpawnTables)
 
void RegisterSpawner (ESpawnAreaID AreaID, UEnemySpawnerComponent *Spawner)
 
void UnregisterSpawner (ESpawnAreaID AreaID, UEnemySpawnerComponent *Spawner)
 
void OnReadyToSpawn (const FWaveDataCollection &WaveData)
 
void SpawnEnemy (TSubclassOf< AEnemyCharacterBase > EnemyClass, const int32 EnemyCount=1, const FVector SpawnPosition=FVector::ZeroVector)
 
FORCEINLINE TArray< AEnemyCharacterBase * > GetAllSpawnedEnemies () const
 
FORCEINLINE int32 GetSpawnRemainingCount () const
 
FORCEINLINE bool IsActivated () const
 

Public 속성

FOnEnemySpawnedStandalone OnEnemySpawned
 
FOnEnemyKilledStandalone OnEnemyKilled
 

Private 멤버 함수

void OnSpawnedEnemyKilled (AEnemyCharacterBase *DiedEnemy)
 
void AdvanceSpawnJob (FActiveEnemySpawnJob &SpawnJob, const float DeltaTime)
 
AEnemyCharacterBaseSpawnEnemyAt (const TSubclassOf< AEnemyCharacterBase > EnemyClass, const FVector &Location)
 
TSubclassOf< AEnemyCharacterBaseResolveEnemyClass (const FName EnemyID) const
 
TSubclassOf< USpawnPatternResolveSpawnPatternClass (const FName SpawnPatternID) const
 

Private 속성

int32 SpawnRemainingCount = 0
 
bool bIsActivated = false
 
FWaveDataCollection CurrentWaveData
 
TObjectPtr< UMonsterDictionaryMonsterDictionary
 
TObjectPtr< USpawnPatternDictionarySpawnPatternDictionary
 
TArray< FActiveEnemySpawnJobActiveSpawnJobs
 
TMap< ESpawnAreaID, FSpawnerContainerSpawnerMap
 
TArray< TObjectPtr< AEnemyCharacterBase > > SpawnedEnemies
 
TSet< TObjectPtr< AEnemyCharacterBase > > ExternalSpawnedEnemies
 

생성자 & 소멸자 문서화

◆ UEnemySpawnDirectorSystemComponent()

UEnemySpawnDirectorSystemComponent::UEnemySpawnDirectorSystemComponent ( )
20{
21 PrimaryComponentTick.bCanEverTick = true;
22 PrimaryComponentTick.bStartWithTickEnabled = false;
23}

멤버 함수 문서화

◆ ActivateSpawners()

void UEnemySpawnDirectorSystemComponent::ActivateSpawners ( const FWaveSpawnData SpawnTables)
198{
199 LOG_INFO(LogCK, "Wave ID : %s", *SpawnTables.Wave_ID.ToString());
200
201 for (const FWaveSpawnEntry& SpawnTable : SpawnTables.SpawnList)
202 {
203 if (SpawnTable.SpawnArea_ID == ESpawnAreaID::None)
204 {
205 LOG_ERROR(LogCK, "SpawnArea_ID가 설정되어있지 않아 건너뜁니다. ");
206 continue;
207 }
208
209 const FMonsterDataCollection* MonsterData = SpawnTables.GetMonsterData(SpawnTable.Enemy_ID);
210
211 if (MonsterData == nullptr)
212 {
213 LOG_ERROR(LogCK, "Monster_ID '%s'에 대한 MonsterData를 찾을 수 없습니다.", *SpawnTable.Enemy_ID.ToString());
214 continue;
215 }
216
217 const TSubclassOf<AEnemyCharacterBase> EnemyClass = ResolveEnemyClass(SpawnTable.Enemy_ID);
218
219 if (EnemyClass == nullptr)
220 {
221 continue;
222 }
223
224 const TSubclassOf<USpawnPattern> PatternClass = ResolveSpawnPatternClass(SpawnTable.Spawn_Pattern_ID);
225
226 if (PatternClass == nullptr)
227 {
228 continue;
229 }
230
231 for (UEnemySpawnerComponent* Spawner : GetSpawners(SpawnTable.SpawnArea_ID))
232 {
233 if (IsValid(Spawner) == false)
234 {
235 continue;
236 }
237
238 FActiveEnemySpawnJob SpawnJob;
239 SpawnJob.SpawnEntry = SpawnTable;
240 SpawnJob.MonsterDataCollection = *MonsterData;
241 SpawnJob.Spawner = Spawner;
242 SpawnJob.EnemyClass = EnemyClass;
243 SpawnJob.SpawnPattern = NewObject<USpawnPattern>(this, PatternClass);
244
245 ActiveSpawnJobs.Add(SpawnJob);
246
247 LOG_SCREEN("%s %d 스포너가 활성화됨", NAMEOF(UEnemySpawnerComponent), Spawner->GetSpawnerAreaMask());
248 LOG_INFO(LogCK, "%s %d 스포너가 활성화됨. Spawn_ID: %s", NAMEOF(UEnemySpawnerComponent), Spawner->GetSpawnerAreaMask(), *SpawnTable.Spawn_ID.ToString());
249 }
250 }
251
252 bIsActivated = true;
253}
#define LOG_SCREEN(Format,...)
Definition CK_UE.h:50
#define LOG_ERROR(Category, Format,...)
Definition CK_UE.h:40
#define LOG_INFO(Category, Format,...)
Definition CK_UE.h:38
#define NAMEOF(Type)
Definition CK_UE.h:30
TSubclassOf< USpawnPattern > ResolveSpawnPatternClass(const FName SpawnPatternID) const
Definition EnemySpawnDirectorSystemComponent.cpp:276
TArray< UEnemySpawnerComponent * > GetSpawners(ESpawnAreaID SpawnerID)
Definition EnemySpawnDirectorSystemComponent.cpp:394
TSubclassOf< AEnemyCharacterBase > ResolveEnemyClass(const FName EnemyID) const
Definition EnemySpawnDirectorSystemComponent.cpp:256
bool bIsActivated
Definition EnemySpawnDirectorSystemComponent.h:144
TArray< FActiveEnemySpawnJob > ActiveSpawnJobs
Definition EnemySpawnDirectorSystemComponent.h:156
Definition EnemySpawnDirectorSystemComponent.h:45
TSubclassOf< AEnemyCharacterBase > EnemyClass
Definition EnemySpawnDirectorSystemComponent.h:62
FWaveSpawnEntry SpawnEntry
Definition EnemySpawnDirectorSystemComponent.h:50
TObjectPtr< USpawnPattern > SpawnPattern
Definition EnemySpawnDirectorSystemComponent.h:59
FMonsterDataCollection MonsterDataCollection
Definition EnemySpawnDirectorSystemComponent.h:53
TObjectPtr< UEnemySpawnerComponent > Spawner
Definition EnemySpawnDirectorSystemComponent.h:56
Definition StageManifest.h:29
FName Wave_ID
Definition StageManifest.h:58
const FMonsterDataCollection * GetMonsterData(const FName &MonsterID) const
Definition StageManifest.cpp:705
Definition DT_SpawnTable.h:9
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ AdvanceSpawnJob()

void UEnemySpawnDirectorSystemComponent::AdvanceSpawnJob ( FActiveEnemySpawnJob SpawnJob,
const float  DeltaTime 
)
private
159{
160 if (SpawnJob.SpawnedCount >= SpawnJob.SpawnEntry.Spawn_Count)
161 {
162 return;
163 }
164
165 if (IsValid(SpawnJob.Spawner) == false)
166 {
167 LOG_ERROR(LogCK, "잘못된 %s를 참조하는 스폰 잡입니다. Spawn_ID: %s", NAMEOF(UEnemySpawnerComponent), *SpawnJob.SpawnEntry.Spawn_ID.ToString());
168 SpawnJob.SpawnedCount = SpawnJob.SpawnEntry.Spawn_Count;
169 return;
170 }
171
172 SpawnJob.ElapsedTime += DeltaTime;
173 const float RequiredDelay = (SpawnJob.SpawnedCount == 0) ? SpawnJob.SpawnEntry.Start_Delay : SpawnJob.SpawnEntry.Spawn_Interval;
174
175 if (SpawnJob.ElapsedTime < RequiredDelay)
176 {
177 return;
178 }
179
180 SpawnJob.ElapsedTime = 0.0f;
181
182 const FVector SpawnLocation = SpawnJob.Spawner->GetSpawnLocation(SpawnJob.SpawnPattern);
183 AEnemyCharacterBase* SpawnedEnemy = SpawnEnemyAt(SpawnJob.EnemyClass, SpawnLocation);
184
185 if (SpawnedEnemy == nullptr)
186 {
187 LOG_ERROR(LogCK, "캐릭터 스폰 실패. Spawner: %s, Enemy_ID: %s", *SpawnJob.Spawner->GetName(), *SpawnJob.SpawnEntry.Enemy_ID.ToString());
188 return;
189 }
190
191 SpawnJob.SpawnedCount++;
193 OnEnemySpawned.Broadcast(SpawnedEnemy);
194}
Definition EnemyCharacterBase.h:49
int32 SpawnRemainingCount
Definition EnemySpawnDirectorSystemComponent.h:141
FOnEnemySpawnedStandalone OnEnemySpawned
Definition EnemySpawnDirectorSystemComponent.h:134
AEnemyCharacterBase * SpawnEnemyAt(const TSubclassOf< AEnemyCharacterBase > EnemyClass, const FVector &Location)
Definition EnemySpawnDirectorSystemComponent.cpp:304
int32 SpawnedCount
Definition EnemySpawnDirectorSystemComponent.h:68
float ElapsedTime
Definition EnemySpawnDirectorSystemComponent.h:65
FName Spawn_ID
Definition DT_SpawnTable.h:14
float Start_Delay
Definition DT_SpawnTable.h:32
FName Enemy_ID
Definition DT_SpawnTable.h:20
int32 Spawn_Count
Definition DT_SpawnTable.h:26
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ClearAll()

void UEnemySpawnDirectorSystemComponent::ClearAll ( const bool  bClearSpawnedActors = true)
overridevirtual

ISpawnSystemInterface를 구현.

66{
67 if (SpawnedEnemies.IsEmpty())
68 {
70 return;
71 }
72
73 if (bClearSpawnedActors == false)
74 {
75 SpawnedEnemies.Empty();
78 return;
79 }
80
82 {
83 if (Enemy == nullptr || IsValid(Enemy) == false)
84 {
85 continue;
86 }
87
88 if (Enemy->OnSpawnEnemyDead.IsBound())
89 {
90 Enemy->OnSpawnEnemyDead.RemoveDynamic(this, &UEnemySpawnDirectorSystemComponent::OnSpawnedEnemyKilled);
91 }
92
93 Enemy->ForceReturnToPool(false);
94 }
95
96 SpawnedEnemies.Empty();
99}
void OnSpawnedEnemyKilled(AEnemyCharacterBase *DiedEnemy)
Definition EnemySpawnDirectorSystemComponent.cpp:116
TArray< TObjectPtr< AEnemyCharacterBase > > SpawnedEnemies
Definition EnemySpawnDirectorSystemComponent.h:162
TSet< TObjectPtr< AEnemyCharacterBase > > ExternalSpawnedEnemies
Definition EnemySpawnDirectorSystemComponent.h:166
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ ClearRegisteredSpawners()

void UEnemySpawnDirectorSystemComponent::ClearRegisteredSpawners ( )
58{
60 SpawnerMap.Empty();
62}
void DeactivateAllSpawners()
Definition EnemySpawnDirectorSystemComponent.cpp:44
FWaveDataCollection CurrentWaveData
Definition EnemySpawnDirectorSystemComponent.h:147
TMap< ESpawnAreaID, FSpawnerContainer > SpawnerMap
Definition EnemySpawnDirectorSystemComponent.h:159
Definition StageManifest.h:74
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ CollectSpawnedTargetables()

void UEnemySpawnDirectorSystemComponent::CollectSpawnedTargetables ( TArray< ITargetableInterface * > &  OutTargetables) const
overridevirtual

ISpawnSystemInterface(으)로부터 재구현되었습니다.

103{
104 OutTargetables.Reserve(SpawnedEnemies.Num());
105 OutTargetables.Append(SpawnedEnemies);
106}

◆ DeactivateAllSpawners()

void UEnemySpawnDirectorSystemComponent::DeactivateAllSpawners ( )
45{
46 if (ActiveSpawnJobs.IsEmpty() == false)
47 {
48 LOG_INFO(LogCK, "활성화된 스폰 잡 %d개를 중단합니다.", ActiveSpawnJobs.Num());
49 }
50
51 ActiveSpawnJobs.Empty();
52 SetComponentTickEnabled(false);
53 bIsActivated = false;
54}
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetAllSpawnedEnemies()

FORCEINLINE TArray< AEnemyCharacterBase * > UEnemySpawnDirectorSystemComponent::GetAllSpawnedEnemies ( ) const
inline
108 {
109 return SpawnedEnemies;
110 }

◆ GetAllSpawners()

TArray< UEnemySpawnerComponent * > UEnemySpawnDirectorSystemComponent::GetAllSpawners ( )
413{
414 if (SpawnerMap.IsEmpty())
415 {
416 return TArray<UEnemySpawnerComponent*>();
417 }
418
419 TArray<UEnemySpawnerComponent*> Result;
420
421 for (auto& [SpawnerID, Spawner] : SpawnerMap)
422 {
423 Result.Append(Spawner.Spawners);
424 }
425
426 return Result;
427}

◆ GetSpawners()

TArray< UEnemySpawnerComponent * > UEnemySpawnDirectorSystemComponent::GetSpawners ( ESpawnAreaID  SpawnerID)
395{
396 if (SpawnerMap.IsEmpty())
397 {
398 return TArray<UEnemySpawnerComponent*>();
399 }
400
401 TArray<UEnemySpawnerComponent*> Result;
402
403 if (const FSpawnerContainer* Container = SpawnerMap.Find(SpawnerID))
404 {
405 Result.Append(Container->Spawners);
406 }
407
408 return Result;
409}
Definition EnemySpawnDirectorSystemComponent.h:33
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetSpawnRemainingCount()

FORCEINLINE int32 UEnemySpawnDirectorSystemComponent::GetSpawnRemainingCount ( ) const
inline
113 {
114 return SpawnRemainingCount;
115 }

◆ Initialize()

void UEnemySpawnDirectorSystemComponent::Initialize ( UStageManagementSubsystem StageManagementSubsystem)
overridevirtual

ISpawnSystemInterface를 구현.

27{
29}
void InitializeStandalone()
Definition EnemySpawnDirectorSystemComponent.cpp:32
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ InitializeStandalone()

void UEnemySpawnDirectorSystemComponent::InitializeStandalone ( )
33{
34 MonsterDictionary = GetEnvironmentAssetByKey<UMonsterDictionary>("MonsterDictionary");
35 ensureAlwaysMsgf(MonsterDictionary, TEXT("%s 로드 실패."), NAMEOF(UMonsterDictionary));
36
37 SpawnPatternDictionary = GetEnvironmentAssetByKey<USpawnPatternDictionary>("SpawnPatternDictionary");
38 ensureAlwaysMsgf(SpawnPatternDictionary, TEXT("%s 로드 실패."), NAMEOF(USpawnPatternDictionary));
39
41}
TObjectPtr< UMonsterDictionary > MonsterDictionary
Definition EnemySpawnDirectorSystemComponent.h:150
TObjectPtr< USpawnPatternDictionary > SpawnPatternDictionary
Definition EnemySpawnDirectorSystemComponent.h:153
Definition MonsterDictionary.h:15
Definition SpawnPatternDictionary.h:15
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ IsActivated()

FORCEINLINE bool UEnemySpawnDirectorSystemComponent::IsActivated ( ) const
inline
118 {
119 return bIsActivated;
120 }

◆ OnReadyToSpawn()

void UEnemySpawnDirectorSystemComponent::OnReadyToSpawn ( const FWaveDataCollection WaveData)
110{
111 CurrentWaveData = WaveData;
112 LOG_INFO(LogCK, "웨이브:%s 스폰 준비 완료.", *WaveData.Wave_ID.ToString());
113}
FName Wave_ID
Definition StageManifest.h:95

◆ OnSpawnedEnemyKilled()

void UEnemySpawnDirectorSystemComponent::OnSpawnedEnemyKilled ( AEnemyCharacterBase DiedEnemy)
private
117{
118 checkf(DiedEnemy, TEXT("죽은 %s에 접근할 수 없습니다. NullPtr입니다. "), NAMEOF(AEnemyCharacterBase));
119 checkf(SpawnRemainingCount >= 0, TEXT("스폰된 몬스터보다 죽은 몬스터가 많을 수 없습니다. "));
120
121 if (DiedEnemy->OnSpawnEnemyDead.IsBound())
122 {
124 }
125
126 SpawnedEnemies.Remove(DiedEnemy);
127 LOG_INFO(LogCK, "Enemy '%s'가 죽었습니다. (남은 몬스터 수: %d)", *DiedEnemy->GetName(), SpawnedEnemies.Num());
128
129 // 외부 요청으로 스폰된 적은 웨이브 클리어 판정에 영향을 주지 않는다.
130 if (ExternalSpawnedEnemies.Remove(DiedEnemy) > 0)
131 {
132 return;
133 }
134
135 SpawnRemainingCount = FMath::Max(SpawnRemainingCount - 1, 0);
136
137 // EncounterField가 OnEnemyKilled를 구독하여 섹션 클리어 조건을 판단한다.
138 OnEnemyKilled.Broadcast(DiedEnemy);
139}
FOnSpawnEnemyDead OnSpawnEnemyDead
Definition EnemyCharacterBase.h:159
FOnEnemyKilledStandalone OnEnemyKilled
Definition EnemySpawnDirectorSystemComponent.h:137
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ RegisterSpawner()

void UEnemySpawnDirectorSystemComponent::RegisterSpawner ( ESpawnAreaID  AreaID,
UEnemySpawnerComponent *  Spawner 
)
345{
346 if (Spawner == nullptr)
347 {
348 LOG_ERROR(LogCK, "인자로 넘어온, %s가 nullptr입니다. ", NAMEOF(UEnemySpawnerComponent));
349 return;
350 }
351
352 if (SpawnerMap.Contains(AreaID) == false)
353 {
354 SpawnerMap.Add(AreaID, FSpawnerContainer());
355 }
356
357 if (SpawnerMap[AreaID].Spawners.Contains(Spawner))
358 {
359 return;
360 }
361
362 SpawnerMap[AreaID].Spawners.Add(Spawner);
363}

◆ ResolveEnemyClass()

TSubclassOf< AEnemyCharacterBase > UEnemySpawnDirectorSystemComponent::ResolveEnemyClass ( const FName  EnemyID) const
private
257{
258 if (MonsterDictionary == nullptr)
259 {
260 LOG_ERROR(LogCK, "'%s'가 로드되어 있지 않습니다.", NAMEOF(UMonsterDictionary));
261 return nullptr;
262 }
263
264 const TSubclassOf<AEnemyCharacterBase>* EnemyClass = MonsterDictionary->MonsterClassMap.Find(EnemyID);
265
266 if (EnemyClass == nullptr)
267 {
268 LOG_ERROR(LogCK, "Enemy_ID '%s'에 대한 클래스를 찾을 수 없습니다.", *EnemyID.ToString());
269 return nullptr;
270 }
271
272 return *EnemyClass;
273}
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ResolveSpawnPatternClass()

TSubclassOf< USpawnPattern > UEnemySpawnDirectorSystemComponent::ResolveSpawnPatternClass ( const FName  SpawnPatternID) const
private
277{
278 if (SpawnPatternDictionary == nullptr)
279 {
280 LOG_ERROR(LogCK, "'%s'가 로드되어 있지 않습니다.", NAMEOF(USpawnPatternDictionary));
281 return nullptr;
282 }
283
284 TSoftClassPtr<USpawnPattern>* PatternPtr = SpawnPatternDictionary->SpawnPatternMap.Find(SpawnPatternID);
285
286 if (PatternPtr == nullptr)
287 {
288 LOG_ERROR(LogCK, "SpawnPattern_ID '%s'에 대한 SpawnPattern을 찾을 수 없습니다.", *SpawnPatternID.ToString());
289 return nullptr;
290 }
291
292 const TSubclassOf<USpawnPattern> PatternClass = PatternPtr->LoadSynchronous();
293
294 if (PatternClass == nullptr)
295 {
296 LOG_ERROR(LogCK, "SpawnPattern 클래스 로드 실패. SpawnPattern_ID: %s", *SpawnPatternID.ToString());
297 return nullptr;
298 }
299
300 return PatternClass;
301}
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SpawnEnemy()

void UEnemySpawnDirectorSystemComponent::SpawnEnemy ( TSubclassOf< AEnemyCharacterBase EnemyClass,
const int32  EnemyCount = 1,
const FVector  SpawnPosition = FVector::ZeroVector 
)
431{
432 // 2기 이상이면 같은 좌표에 겹쳐 스폰되지 않도록 원형으로 분산시킨다.
433 const float ScatterRadius = (EnemyCount > 1) ? 150.0f : 0.0f;
434
435 for (int32 Index = 0; Index < EnemyCount; ++Index)
436 {
437 const float Angle = 2.0f * PI * Index / EnemyCount;
438 const FVector SpawnLocation = SpawnPosition + FVector(FMath::Cos(Angle), FMath::Sin(Angle), 0.0f) * ScatterRadius;
439
440 AEnemyCharacterBase* SpawnedEnemy = SpawnEnemyAt(EnemyClass, SpawnLocation);
441
442 if (SpawnedEnemy == nullptr)
443 {
444 continue;
445 }
446
447 // SpawnArea를 거치지 않았으므로 웨이브 카운트에는 넣지 않고, 조회/정리 대상으로만 등록한다.
448 ExternalSpawnedEnemies.Add(SpawnedEnemy);
449 }
450}
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ SpawnEnemyAt()

AEnemyCharacterBase * UEnemySpawnDirectorSystemComponent::SpawnEnemyAt ( const TSubclassOf< AEnemyCharacterBase EnemyClass,
const FVector &  Location 
)
private
305{
306 if (EnemyClass == nullptr)
307 {
308 LOG_ERROR(LogCK, "스폰할 %s 클래스가 nullptr입니다. ", NAMEOF(AEnemyCharacterBase));
309 return nullptr;
310 }
311
312 const UWorld* World = GetWorld();
313
314 if (World == nullptr)
315 {
316 LOG_ERROR(LogCK, "World가 nullptr이라 스폰할 수 없습니다. ");
317 return nullptr;
318 }
319
320 UPoolWorldSubsystem* Pool = World->GetSubsystem<UPoolWorldSubsystem>();
321
322 if (Pool == nullptr)
323 {
324 LOG_ERROR(LogCK, "%s이 존재하지 않습니다. ", NAMEOF(UPoolWorldSubsystem));
325 return nullptr;
326 }
327
328 AEnemyCharacterBase* SpawnedEnemy = Cast<AEnemyCharacterBase>(Pool->GetActorFromPool(EnemyClass, Location, FRotator::ZeroRotator));
329
330 if (SpawnedEnemy == nullptr)
331 {
332 LOG_ERROR(LogCK, "풀에서 %s를 가져오지 못했습니다. (Class: %s)", NAMEOF(AEnemyCharacterBase), *EnemyClass->GetName());
333 return nullptr;
334 }
335
336 SpawnedEnemies.Add(SpawnedEnemy);
338
339 LOG_INFO(LogCK, "Enemy 생성 성공. (Class: %s, Position: %s)", *EnemyClass->GetName(), *Location.ToString());
340 return SpawnedEnemy;
341}
Definition PoolWorldSubsystem.h:28
AActor * GetActorFromPool(TSubclassOf< AActor > ActorClass, FVector Location, FRotator Rotation)
Definition PoolWorldSubsystem.cpp:203
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ TickComponent()

void UEnemySpawnDirectorSystemComponent::TickComponent ( float  DeltaTime,
ELevelTick  TickType,
FActorComponentTickFunction *  ThisTickFunction 
)
overridevirtual
143{
144 Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
145
146 if (ActiveSpawnJobs.IsEmpty())
147 {
148 return;
149 }
150
151 for (FActiveEnemySpawnJob& SpawnJob : ActiveSpawnJobs)
152 {
153 AdvanceSpawnJob(SpawnJob, DeltaTime);
154 }
155}
void AdvanceSpawnJob(FActiveEnemySpawnJob &SpawnJob, const float DeltaTime)
Definition EnemySpawnDirectorSystemComponent.cpp:158
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ UnregisterSpawner()

void UEnemySpawnDirectorSystemComponent::UnregisterSpawner ( ESpawnAreaID  AreaID,
UEnemySpawnerComponent *  Spawner 
)
367{
368 if (Spawner == nullptr)
369 {
370 LOG_ERROR(LogCK, "인자로 넘어온, %s가 nullptr입니다. ", NAMEOF(UEnemySpawnerComponent));
371 return;
372 }
373
374 FSpawnerContainer* Container = SpawnerMap.Find(AreaID);
375
376 if (Container == nullptr)
377 {
378 LOG_ERROR(LogCK, "%s를 찾을 수 없습니다. ", *Utils::EnumToString(AreaID));
379 return;
380 }
381
382 Container->Spawners.Remove(Spawner);
383
384 // 해제된 스포너를 참조하는 잡은 더 이상 진행할 수 없다.
385 auto IsOrphanedJob = [Spawner](const FActiveEnemySpawnJob& SpawnJob)
386 {
387 return SpawnJob.Spawner == Spawner;
388 };
389
390 ActiveSpawnJobs.RemoveAll(IsOrphanedJob);
391}
TArray< TObjectPtr< UEnemySpawnerComponent > > Spawners
Definition EnemySpawnDirectorSystemComponent.h:38

멤버 데이터 문서화

◆ ActiveSpawnJobs

TArray<FActiveEnemySpawnJob> UEnemySpawnDirectorSystemComponent::ActiveSpawnJobs
private

◆ bIsActivated

bool UEnemySpawnDirectorSystemComponent::bIsActivated = false
private

◆ CurrentWaveData

FWaveDataCollection UEnemySpawnDirectorSystemComponent::CurrentWaveData
private

◆ ExternalSpawnedEnemies

TSet<TObjectPtr<AEnemyCharacterBase> > UEnemySpawnDirectorSystemComponent::ExternalSpawnedEnemies
private

◆ MonsterDictionary

TObjectPtr<UMonsterDictionary> UEnemySpawnDirectorSystemComponent::MonsterDictionary
private

◆ OnEnemyKilled

FOnEnemyKilledStandalone UEnemySpawnDirectorSystemComponent::OnEnemyKilled

◆ OnEnemySpawned

FOnEnemySpawnedStandalone UEnemySpawnDirectorSystemComponent::OnEnemySpawned

◆ SpawnedEnemies

TArray<TObjectPtr<AEnemyCharacterBase> > UEnemySpawnDirectorSystemComponent::SpawnedEnemies
private

◆ SpawnerMap

TMap<ESpawnAreaID, FSpawnerContainer> UEnemySpawnDirectorSystemComponent::SpawnerMap
private

◆ SpawnPatternDictionary

TObjectPtr<USpawnPatternDictionary> UEnemySpawnDirectorSystemComponent::SpawnPatternDictionary
private

◆ SpawnRemainingCount

int32 UEnemySpawnDirectorSystemComponent::SpawnRemainingCount = 0
private

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