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

#include <EncounterField.h>

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

Public 멤버 함수

 AEncounterField ()
 
void StartEncounter ()
 
void DeactivateEncounter ()
 
virtual UStageEventListenerComponent * GetEventListenerComponent () const override
 
virtual EStageEvent GetStageEvent () const override
 
FORCEINLINE bool IsEncounterActive () const
 
- IStageEventListenerInterface(으)로부터 상속된 Public 멤버 함수
virtual EListenerSlot GetSlotForEvent (const FName EventID) const
 
virtual const TMap< FName, EListenerSlot > * GetListenEvents () const
 

Protected 멤버 함수

virtual void EndPlay (const EEndPlayReason::Type EndPlayReason) override
 

Protected 속성

TObjectPtr< UStageEventListenerComponent > EventListenerComponent
 
TObjectPtr< UStageEventSenderComponent > ClearEventSender
 
TObjectPtr< UStageEventSenderComponent > EnemyKilledEventSender
 
FName SectionID
 

Private 멤버 함수

void SpawnNextWave ()
 
void ScheduleNextWave (float Interval)
 
int32 CalculateExpectedEnemyCount (UEnemySpawnDirectorSystemComponent *EnemySys, const FWaveSpawnData &SpawnTables) const
 
void TrySendClearEvent ()
 
void ResetEncounterState ()
 
void OnEnemyKilled (const AEnemyCharacterBase *DiedEnemy)
 
void OnEnemySpawned (AEnemyCharacterBase *SpawnedEnemy)
 

Private 속성

TObjectPtr< UEnemySpawnDirectorSystemComponentEnemySpawnSystem
 
FName CurrentWaveID
 
int32 CurrentWaveIndex = 0
 
int32 AliveEnemyCount = 0
 
int32 PendingSpawnCount = 0
 
int32 CurrentWavePendingSpawnCount = 0
 
bool bAllWavesSpawned = false
 
bool bActivated = false
 
bool bClearEventSent = false
 
FTimerHandle WaveTimerHandle
 

상세한 설명

스테이지 이벤트로 활성화되면 웨이브별 몬스터를 스폰하고, 섹션 내 모든 몬스터가 처치되면 완료 이벤트를 전송하는 필드 액터.

레벨에 배치 후 에디터에서 USpawnAreaComponent를 하위 컴포넌트로 추가하고 SectionID, ClearEventSender를 설정.

생성자 & 소멸자 문서화

◆ AEncounterField()

AEncounterField::AEncounterField ( )
24{
25 EventListenerComponent = CreateDefaultSubobject<UStageEventListenerComponent>(TEXT("EventListenerComponent"));
26 ClearEventSender = CreateDefaultSubobject<UStageEventSenderComponent>(TEXT("ClearEventSender"));
27 EnemyKilledEventSender = CreateDefaultSubobject<UStageEventSenderComponent>(TEXT("EnemyKilledEventSender"));
28}
TObjectPtr< UStageEventSenderComponent > ClearEventSender
Definition EncounterField.h:82
TObjectPtr< UStageEventListenerComponent > EventListenerComponent
Definition EncounterField.h:78
TObjectPtr< UStageEventSenderComponent > EnemyKilledEventSender
Definition EncounterField.h:86

멤버 함수 문서화

◆ CalculateExpectedEnemyCount()

int32 AEncounterField::CalculateExpectedEnemyCount ( UEnemySpawnDirectorSystemComponent EnemySys,
const FWaveSpawnData SpawnTables 
) const
private
272{
273 if (EnemySys == nullptr)
274 {
275 return 0;
276 }
277
278 int32 ExpectedEnemyCount = 0;
279
280 for (const FWaveSpawnEntry& SpawnTable : SpawnTables.SpawnList)
281 {
282 if (SpawnTable.Spawn_Count == 0)
283 {
284 continue;
285 }
286
287 if (SpawnTable.SpawnArea_ID == ESpawnAreaID::None)
288 {
289 LOG_WARNING(LogCKLevel, "EncounterField: Spawn_ID '%s'의 SpawnArea_ID가 None입니다.", *SpawnTable.Spawn_ID.ToString());
290 continue;
291 }
292
293 if (SpawnTables.GetMonsterData(SpawnTable.Enemy_ID) == nullptr)
294 {
295 LOG_WARNING(LogCKLevel, "EncounterField: Spawn_ID '%s'의 MonsterData를 찾을 수 없습니다. Enemy_ID: %s", *SpawnTable.Spawn_ID.ToString(), *SpawnTable.Enemy_ID.ToString());
296 continue;
297 }
298
299 const TArray<UEnemySpawnerComponent*> SpawnAreas = EnemySys->GetSpawners(SpawnTable.SpawnArea_ID);
300
301 if (SpawnAreas.IsEmpty())
302 {
303 LOG_WARNING(LogCKLevel, "EncounterField: Spawn_ID '%s'에 사용할 SpawnArea가 등록되지 않았습니다.", *SpawnTable.Spawn_ID.ToString());
304 continue;
305 }
306
307 for (UEnemySpawnerComponent* SpawnArea : SpawnAreas)
308 {
309 if (IsValid(SpawnArea) == false)
310 {
311 continue;
312 }
313
314 ExpectedEnemyCount += SpawnTable.Spawn_Count;
315 }
316 }
317
318 return ExpectedEnemyCount;
319}
#define LOG_WARNING(Category, Format,...)
Definition CK_UE.h:39
TArray< UEnemySpawnerComponent * > GetSpawners(ESpawnAreaID SpawnerID)
Definition EnemySpawnDirectorSystemComponent.cpp:394
const FMonsterDataCollection * GetMonsterData(const FName &MonsterID) const
Definition StageManifest.cpp:705
Definition DT_SpawnTable.h:9
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ DeactivateEncounter()

void AEncounterField::DeactivateEncounter ( )
141{
143 check(StageManager);
144
145 GetWorld()->GetTimerManager().ClearTimer(WaveTimerHandle);
146 StageManager->NotifyNextWaveCountdownStopped();
147
148 if (IsValid(EnemySpawnSystem))
149 {
150 EnemySpawnSystem->OnEnemySpawned.RemoveDynamic(this, &AEncounterField::OnEnemySpawned);
151 EnemySpawnSystem->OnEnemyKilled.RemoveDynamic(this, &AEncounterField::OnEnemyKilled);
152 EnemySpawnSystem->ClearRegisteredSpawners();
153 EnemySpawnSystem->ClearAll(true);
154 EnemySpawnSystem = nullptr;
156 }
157 else
158 {
159 EnemySpawnSystem = nullptr;
161 }
162
163 StageManager->SetCurrentWaveRemainingEnemyCount(0);
164}
void ResetEncounterState()
Definition EncounterField.cpp:344
TObjectPtr< UEnemySpawnDirectorSystemComponent > EnemySpawnSystem
Definition EncounterField.h:94
void OnEnemyKilled(const AEnemyCharacterBase *DiedEnemy)
Definition EncounterField.cpp:357
void OnEnemySpawned(AEnemyCharacterBase *SpawnedEnemy)
Definition EncounterField.cpp:376
FTimerHandle WaveTimerHandle
Definition EncounterField.h:122
static UStageManagementSubsystem * GetStageManagementSubsystem(const UObject *WorldContextObject)
Definition CK_BPFunctionLibrary.cpp:104
Definition StageManagementSubsystem.h:147
void NotifyNextWaveCountdownStopped()
Definition StageManagementSubsystem.cpp:268
void SetCurrentWaveRemainingEnemyCount(int32 Count)
Definition StageManagementSubsystem.cpp:208
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ EndPlay()

void AEncounterField::EndPlay ( const EEndPlayReason::Type  EndPlayReason)
overrideprotectedvirtual
32{
34
35 Super::EndPlay(EndPlayReason);
36}
void DeactivateEncounter()
Definition EncounterField.cpp:140
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ GetEventListenerComponent()

virtual UStageEventListenerComponent * AEncounterField::GetEventListenerComponent ( ) const
inlineoverridevirtual

IStageEventListenerInterface를 구현.

43 {
45 }

◆ GetStageEvent()

virtual EStageEvent AEncounterField::GetStageEvent ( ) const
inlineoverridevirtual

◆ IsEncounterActive()

FORCEINLINE bool AEncounterField::IsEncounterActive ( ) const
inline
55 {
56 return bActivated;
57 }
bool bActivated
Definition EncounterField.h:116
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnEnemyKilled()

void AEncounterField::OnEnemyKilled ( const AEnemyCharacterBase DiedEnemy)
private
358{
359 AliveEnemyCount = FMath::Max(AliveEnemyCount - 1, 0);
360
361 if (UStageManagementSubsystem* StageManager = GetWorld()->GetSubsystem<UStageManagementSubsystem>())
362 {
363 StageManager->DecreaseCurrentWaveRemainingEnemyCount();
364 StageManager->OnSpawnedEnemyKilled.Broadcast(DiedEnemy, StageManager->GetTotalSpawnRemainingCount());
365 }
366
368 {
369 EnemyKilledEventSender->Send(DiedEnemy);
370 }
371
373}
int32 AliveEnemyCount
Definition EncounterField.h:104
void TrySendClearEvent()
Definition EncounterField.cpp:322
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnEnemySpawned()

void AEncounterField::OnEnemySpawned ( AEnemyCharacterBase SpawnedEnemy)
private
377{
378 if (SpawnedEnemy == nullptr)
379 {
380 return;
381 }
382
384 PendingSpawnCount = FMath::Max(PendingSpawnCount - 1, 0);
386}
int32 CurrentWavePendingSpawnCount
Definition EncounterField.h:110
int32 PendingSpawnCount
Definition EncounterField.h:107
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ResetEncounterState()

void AEncounterField::ResetEncounterState ( )
private
345{
346 CurrentWaveID = NAME_None;
348 AliveEnemyCount = 0;
351 bAllWavesSpawned = false;
352 bActivated = false;
353 bClearEventSent = false;
354}
bool bAllWavesSpawned
Definition EncounterField.h:113
bool bClearEventSent
Definition EncounterField.h:119
FName CurrentWaveID
Definition EncounterField.h:97
int32 CurrentWaveIndex
Definition EncounterField.h:101
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ScheduleNextWave()

void AEncounterField::ScheduleNextWave ( float  Interval)
private
250{
251 if (Interval < KINDA_SMALL_NUMBER)
252 {
254 return;
255 }
256
257 FTimerDelegate Delegate = FTimerDelegate::CreateUObject(this, &AEncounterField::SpawnNextWave);
258
259 UWorld* World = GetWorld();
260 check(World);
261
262 if (UStageManagementSubsystem* StageManager = World->GetSubsystem<UStageManagementSubsystem>())
263 {
264 StageManager->NotifyNextWaveCountdownStarted(Interval);
265 }
266
267 World->GetTimerManager().SetTimer(WaveTimerHandle, Delegate, Interval, false);
268}
void SpawnNextWave()
Definition EncounterField.cpp:167
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SpawnNextWave()

void AEncounterField::SpawnNextWave ( )
private
168{
169 UWorld* World = GetWorld();
170
171 if (UStageManagementSubsystem* StageManager = World ? World->GetSubsystem<UStageManagementSubsystem>() : nullptr)
172 {
173 StageManager->NotifyNextWaveCountdownStopped();
174 }
175
176 if (IsValid(EnemySpawnSystem) == false)
177 {
178 LOG_WARNING(LogCKLevel, "EncounterField: EnemySpawnSystem이 없어 웨이브 스폰을 건너뜁니다.");
179 return;
180 }
181
182 UStageManifest* Manifest = UDataBundleRegistry::GetBundleAssetByTag<UStageManifest>(TAG_BUNDLE_INITIAL);
183
184 if (Manifest == nullptr)
185 {
186 return;
187 }
188
189 FSectionData SectionData = Manifest->GetSectionTable(SectionID);
190 const FWaveDataCollection* Wave = SectionData.GetWave(CurrentWaveID);
191
192 if (Wave == nullptr)
193 {
194 LOG_WARNING(LogCKLevel, "EncounterField: 웨이브 '%s'를 찾을 수 없어 스폰을 종료합니다.", *CurrentWaveID.ToString());
195 bAllWavesSpawned = true;
197 return;
198 }
199
201 {
202 if (UStageManagementSubsystem* StageManager = GetWorld()->GetSubsystem<UStageManagementSubsystem>())
203 {
204 StageManager->DecreaseCurrentWaveRemainingEnemyCount(CurrentWavePendingSpawnCount);
205 }
206
209 }
210
211 EnemySpawnSystem->DeactivateAllSpawners();
212
213 const FWaveSpawnData SpawnTables = Wave->GetSpawnTables();
214 const int32 ExpectedEnemyCount = CalculateExpectedEnemyCount(EnemySpawnSystem, SpawnTables);
215 CurrentWavePendingSpawnCount = ExpectedEnemyCount;
216 PendingSpawnCount += ExpectedEnemyCount;
217
218 if (UStageManagementSubsystem* StageManager = GetWorld()->GetSubsystem<UStageManagementSubsystem>())
219 {
220 StageManager->IncreaseCurrentWaveRemainingEnemyCount(ExpectedEnemyCount);
221 }
222
223 EnemySpawnSystem->SetComponentTickEnabled(true);
224 EnemySpawnSystem->ActivateSpawners(SpawnTables);
225
226 LOG_INFO(LogCKLevel, "EncounterField: 웨이브 '%s' 시작 (예정 스폰: %d, 대기 스폰: %d, 생존 몬스터: %d)", *CurrentWaveID.ToString(), ExpectedEnemyCount, PendingSpawnCount, AliveEnemyCount);
227
228 if (UStageManagementSubsystem* StageManager = GetWorld()->GetSubsystem<UStageManagementSubsystem>())
229 {
230 StageManager->OnWaveStarted.Broadcast(*Wave, CurrentWaveIndex);
231 }
232
234
235 if (Wave->IsLastWave())
236 {
237 bAllWavesSpawned = true;
238 }
239 else
240 {
243 }
244
246}
#define LOG_INFO(Category, Format,...)
Definition CK_UE.h:38
FName SectionID
Definition EncounterField.h:90
void ScheduleNextWave(float Interval)
Definition EncounterField.cpp:249
int32 CalculateExpectedEnemyCount(UEnemySpawnDirectorSystemComponent *EnemySys, const FWaveSpawnData &SpawnTables) const
Definition EncounterField.cpp:271
Definition StageManifest.h:161
virtual FSectionData GetSectionTable(const FName &SectionID)
Definition StageManifest.cpp:656
FName NextWave_ID
Definition DT_WaveTable.h:31
float Wave_Interval
Definition DT_WaveTable.h:23
Definition StageManifest.h:133
const FWaveDataCollection * GetWave(const FName &WaveID) const
Definition StageManifest.cpp:680
Definition StageManifest.h:74
FWaveSpawnData GetSpawnTables() const
Definition StageManifest.cpp:686
FDT_WaveTable WaveTable
Definition StageManifest.h:98
bool IsLastWave() const
Definition StageManifest.cpp:737
Definition StageManifest.h:47
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ StartEncounter()

void AEncounterField::StartEncounter ( )
40{
41 if (bActivated)
42 {
43 return;
44 }
45
46 UStageManifest* Manifest = UDataBundleRegistry::GetBundleAssetByTag<UStageManifest>(TAG_BUNDLE_INITIAL);
47
48 if (ensureMsgf(Manifest, TEXT("EncounterField: UStageManifest를 번들에서 찾을 수 없습니다.")) == false)
49 {
50 return;
51 }
52
53 UStageManagementSubsystem* StageManager = GetWorld()->GetSubsystem<UStageManagementSubsystem>();
54
55 if (ensureMsgf(StageManager, TEXT("EncounterField: UStageManagementSubsystem이 없습니다.")) == false)
56 {
57 return;
58 }
59
61
62 FSectionData SectionData = Manifest->GetSectionTable(SectionID);
63
64 if (SectionData.SectionTable.Section_ID.IsNone())
65 {
66 LOG_ERROR(LogCKLevel, "EncounterField: 섹션 '%s'를 찾을 수 없습니다.", *SectionID.ToString());
67 return;
68 }
69
70 const FWaveDataCollection* FirstWave = SectionData.GetWaveTable();
71
72 if (FirstWave == nullptr)
73 {
74 LOG_ERROR(LogCKLevel, "EncounterField: 섹션 '%s'의 첫 번째 웨이브를 찾을 수 없습니다.", *SectionID.ToString());
75 return;
76 }
77
78 CurrentWaveID = FirstWave->Wave_ID;
79
80 if (ensureMsgf(CurrentWaveID.IsValid(), TEXT("EncounterField: 섹션 '%s'의 첫 번째 웨이브를 찾을 수 없습니다."), *SectionID.ToString()) == false)
81 {
82 return;
83 }
84
85 const FWaveDataCollection* StartWave = SectionData.GetWave(CurrentWaveID);
86
87 if (StartWave == nullptr)
88 {
89 LOG_ERROR(LogCKLevel, "EncounterField: 시작 웨이브 '%s'를 찾을 수 없습니다.", *CurrentWaveID.ToString());
90 return;
91 }
92
93 ASpawnHub* SpawnHub = StageManager->GetOrCreateSpawnHub();
94
95 if (ensureMsgf(SpawnHub, TEXT("EncounterField: SpawnHub를 생성하지 못했습니다.")) == false)
96 {
97 return;
98 }
99
101
102 if (ensureMsgf(EnemySpawnSystem, TEXT("EncounterField: SpawnHub에서 EnemySpawnSystem을 가져오지 못했습니다.")) == false)
103 {
104 return;
105 }
106
108 EnemySpawnSystem->ClearAll(true);
109 StageManager->SetCurrentWaveRemainingEnemyCount(0);
110
111 // 하위 SpawnAreaComponent를 모두 수집하여 EnemySpawnSystem에 등록한다.
112 TArray<UEnemySpawnerComponent*> SpawnAreas;
113 GetComponents<UEnemySpawnerComponent>(SpawnAreas);
114
115 Algo::NullSafeForEach(SpawnAreas, [this](UEnemySpawnerComponent* Area)
116 {
117 EnemySpawnSystem->RegisterSpawner(Area->GetID(), Area);
118 });
119
120 EnemySpawnSystem->OnReadyToSpawn(*StartWave);
121 EnemySpawnSystem->OnEnemySpawned.AddDynamic(this, &AEncounterField::OnEnemySpawned);
122 EnemySpawnSystem->OnEnemyKilled.AddDynamic(this, &AEncounterField::OnEnemyKilled);
123
124 if (StageManager)
125 {
126 StageManager->ReadyToSpawn.Broadcast(*StartWave);
127 }
128
129 bActivated = true;
130
131 USnapshotSubsystem::ProcessNewCommand<UEncounterActivationCommand>(this, [this](UEncounterActivationCommand* Command)
132 {
133 Command->Initialize(this);
134 });
135
137}
#define LOG_ERROR(Category, Format,...)
Definition CK_UE.h:40
Definition SpawnHub.h:27
UActorComponent * GetOrCreateSpawnSystem(UPARAM(meta=(MustImplement="/Script/CK_UE.SpawnSystemInterface")) TSubclassOf< UActorComponent > SpawnSystemClass)
Definition EncounterActivationCommand.h:13
void Initialize(AEncounterField *InEncounterField)
Definition EncounterActivationCommand.cpp:8
Definition EnemySpawnDirectorSystemComponent.h:75
void ClearRegisteredSpawners()
Definition EnemySpawnDirectorSystemComponent.cpp:57
ASpawnHub * GetOrCreateSpawnHub()
Definition StageManagementSubsystem.cpp:98
FOnWaveManagerReadyToSpawning ReadyToSpawn
Definition StageManagementSubsystem.h:233
FName Section_ID
Definition DT_SectionTable.h:20
const FWaveDataCollection * GetWaveTable() const
Definition StageManifest.cpp:674
FDT_SectionTable SectionTable
Definition StageManifest.h:148
FName Wave_ID
Definition StageManifest.h:95
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ TrySendClearEvent()

void AEncounterField::TrySendClearEvent ( )
private
323{
325 {
326 return;
327 }
328
329 if (ClearEventSender == nullptr)
330 {
331 LOG_ERROR(LogCKLevel, "EncounterField: ClearEventSender가 nullptr입니다.");
332 return;
333 }
334
335 bClearEventSent = true;
336 LOG_INFO(LogCKLevel, "EncounterField: 모든 몬스터 처치 완료. 완료 이벤트 전송.");
337 ClearEventSender->Send(nullptr);
338
339 // 다음 트리거에서 새 사이클이 시작될 수 있도록 자동 비활성화.
341}
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ AliveEnemyCount

int32 AEncounterField::AliveEnemyCount = 0
private

◆ bActivated

bool AEncounterField::bActivated = false
private

◆ bAllWavesSpawned

bool AEncounterField::bAllWavesSpawned = false
private

◆ bClearEventSent

bool AEncounterField::bClearEventSent = false
private

◆ ClearEventSender

TObjectPtr<UStageEventSenderComponent> AEncounterField::ClearEventSender
protected

◆ CurrentWaveID

FName AEncounterField::CurrentWaveID
private

◆ CurrentWaveIndex

int32 AEncounterField::CurrentWaveIndex = 0
private

◆ CurrentWavePendingSpawnCount

int32 AEncounterField::CurrentWavePendingSpawnCount = 0
private

◆ EnemyKilledEventSender

TObjectPtr<UStageEventSenderComponent> AEncounterField::EnemyKilledEventSender
protected

◆ EnemySpawnSystem

TObjectPtr<UEnemySpawnDirectorSystemComponent> AEncounterField::EnemySpawnSystem
private

◆ EventListenerComponent

TObjectPtr<UStageEventListenerComponent> AEncounterField::EventListenerComponent
protected

◆ PendingSpawnCount

int32 AEncounterField::PendingSpawnCount = 0
private

◆ SectionID

FName AEncounterField::SectionID
protected

◆ WaveTimerHandle

FTimerHandle AEncounterField::WaveTimerHandle
private

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