Payback 0.0.1
CK Graduation Project
로딩중...
검색중...
일치하는것 없음
EnemySpawnDirectorSystemComponent.h
이 파일의 문서화 페이지로 가기
1// Fill out your copyright notice in the Description page of Project Settings.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "Components/ActorComponent.h"
11#include "EnemySpawnDirectorSystemComponent.generated.h"
12
13
16class USpawnPattern;
18class UEnemySpawnerComponent;
20
21
22DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnSpawnedEnemyKilled, const AEnemyCharacterBase*, DiedEnemy, const int32, RemainingCount);
23
25
26DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnEnemySpawnedStandalone, AEnemyCharacterBase*, SpawnedEnemy);
27
28DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnEnemyKilledStandalone, const AEnemyCharacterBase*, DiedEnemy);
29
30
31USTRUCT(BlueprintType)
33{
34 GENERATED_BODY()
35
36public:
37 UPROPERTY(BlueprintReadOnly)
38 TArray<TObjectPtr<UEnemySpawnerComponent>> Spawners;
39};
40
41
42// 활성화된 스폰 잡 하나. 어느 스포너에서 어떤 적을 어떤 간격으로 몇 기 뽑을지를 담는다.
43USTRUCT()
45{
46 GENERATED_BODY()
47
48public:
49 UPROPERTY(Transient)
50 FWaveSpawnEntry SpawnEntry;
51
52 UPROPERTY(Transient)
53 FMonsterDataCollection MonsterDataCollection;
54
55 UPROPERTY(Transient)
56 TObjectPtr<UEnemySpawnerComponent> Spawner;
57
58 UPROPERTY(Transient)
59 TObjectPtr<USpawnPattern> SpawnPattern;
60
61 UPROPERTY(Transient)
62 TSubclassOf<AEnemyCharacterBase> EnemyClass;
63
64 UPROPERTY(Transient)
65 float ElapsedTime = 0.0f;
66
67 UPROPERTY(Transient)
68 int32 SpawnedCount = 0;
69};
70
71
72// Enemy Spawner Component 가 어디에 몬스터를 스폰할지와 스폰을 담당한다면 Spawn Director는 타이밍과 어떤 구역의 Spawner를 사용할지와 타이밍을 계산한다.
73UCLASS(ClassGroup=(Custom), BlueprintType)
74class CK_UE_API UEnemySpawnDirectorSystemComponent : public UActorComponent, public ISpawnSystemInterface
75{
76 GENERATED_BODY()
77
78public:
80
81public:
82 virtual void Initialize(UStageManagementSubsystem* StageManagementSubsystem) override;
83 virtual void ClearAll(const bool bClearSpawnedActors = true) override;
84 virtual void CollectSpawnedTargetables(TArray<ITargetableInterface*>& OutTargetables) const override;
85 virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
86
87 void InitializeStandalone();
88 void DeactivateAllSpawners();
89 void ClearRegisteredSpawners();
90
91 TArray<UEnemySpawnerComponent*> GetSpawners(ESpawnAreaID SpawnerID);
92 TArray<UEnemySpawnerComponent*> GetAllSpawners();
93
94 void ActivateSpawners(const FWaveSpawnData& SpawnTables);
95 void RegisterSpawner(ESpawnAreaID AreaID, UEnemySpawnerComponent* Spawner);
96 void UnregisterSpawner(ESpawnAreaID AreaID, UEnemySpawnerComponent* Spawner);
97
98public:
99 UFUNCTION()
100 void OnReadyToSpawn(const FWaveDataCollection& WaveData);
101
102 // SpawnArea를 거치지 않고 외부에서 직접 요청하는 스폰 진입점. (치트/디버그용)
103 UFUNCTION(BlueprintCallable, Category="Spawn|Enemy")
104 void SpawnEnemy(TSubclassOf<AEnemyCharacterBase> EnemyClass, const int32 EnemyCount = 1, const FVector SpawnPosition = FVector::ZeroVector);
105
106public:
107 FORCEINLINE TArray<AEnemyCharacterBase*> GetAllSpawnedEnemies() const
108 {
109 return SpawnedEnemies;
110 }
111
112 FORCEINLINE int32 GetSpawnRemainingCount() const
113 {
114 return SpawnRemainingCount;
115 }
116
117 FORCEINLINE bool IsActivated() const
118 {
119 return bIsActivated;
120 }
121
122private:
123 UFUNCTION()
124 void OnSpawnedEnemyKilled(AEnemyCharacterBase* DiedEnemy);
125 void AdvanceSpawnJob(FActiveEnemySpawnJob& SpawnJob, const float DeltaTime);
126
127 // 풀에서 적을 꺼내 추적 목록에 등록하는 유일한 진입점.
128 AEnemyCharacterBase* SpawnEnemyAt(const TSubclassOf<AEnemyCharacterBase> EnemyClass, const FVector& Location);
129 TSubclassOf<AEnemyCharacterBase> ResolveEnemyClass(const FName EnemyID) const;
130 TSubclassOf<USpawnPattern> ResolveSpawnPatternClass(const FName SpawnPatternID) const;
131
132public:
133 UPROPERTY(BlueprintAssignable, Category = "Spawn|Enemy")
134 FOnEnemySpawnedStandalone OnEnemySpawned;
135
136 UPROPERTY(BlueprintAssignable, Category = "Spawn|Enemy")
137 FOnEnemyKilledStandalone OnEnemyKilled;
138
139private:
140 UPROPERTY(Transient)
141 int32 SpawnRemainingCount = 0;
142
143 UPROPERTY(Transient)
144 bool bIsActivated = false;
145
146 UPROPERTY()
147 FWaveDataCollection CurrentWaveData;
148
149 UPROPERTY(Transient)
150 TObjectPtr<UMonsterDictionary> MonsterDictionary;
151
152 UPROPERTY(Transient)
153 TObjectPtr<USpawnPatternDictionary> SpawnPatternDictionary;
154
155 UPROPERTY(Transient)
156 TArray<FActiveEnemySpawnJob> ActiveSpawnJobs;
157
158 UPROPERTY(Transient, BlueprintReadOnly, meta = (AllowPrivateAccess = "true"))
160
161 UPROPERTY(Transient, BlueprintReadOnly, meta = (AllowPrivateAccess = "true"))
162 TArray<TObjectPtr<AEnemyCharacterBase>> SpawnedEnemies;
163
164 // SpawnArea가 아닌 외부 요청으로 스폰된 적. 웨이브 진행도 집계에서 제외하기 위해 별도로 추적한다.
165 UPROPERTY(Transient)
166 TSet<TObjectPtr<AEnemyCharacterBase>> ExternalSpawnedEnemies;
167};
ESpawnAreaID
Definition ESpawnAreaID.h:7
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnEnemySpawnedStandalone, AEnemyCharacterBase *, SpawnedEnemy)
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnSpawnedEnemyKilled, const AEnemyCharacterBase *, DiedEnemy, const int32, RemainingCount)
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnCurrentWaveCleared)
Definition EnemyCharacterBase.h:49
Definition SpawnSystemInterface.h:24
Definition TargetableInterface.h:20
Definition EnemySpawnDirectorSystemComponent.h:75
FORCEINLINE int32 GetSpawnRemainingCount() const
Definition EnemySpawnDirectorSystemComponent.h:112
FORCEINLINE TArray< AEnemyCharacterBase * > GetAllSpawnedEnemies() const
Definition EnemySpawnDirectorSystemComponent.h:107
FORCEINLINE bool IsActivated() const
Definition EnemySpawnDirectorSystemComponent.h:117
Definition MonsterDictionary.h:15
Definition SpawnPatternDictionary.h:15
Definition SpawnPattern.h:23
Definition StageManagementSubsystem.h:147
Definition EnemySpawnDirectorSystemComponent.h:45
Definition StageManifest.h:29
Definition EnemySpawnDirectorSystemComponent.h:33
Definition StageManifest.h:74
Definition StageManifest.h:47
Definition DT_SpawnTable.h:9