Payback 0.0.1
CK Graduation Project
로딩중...
검색중...
일치하는것 없음
SpawnHub.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 "GameFramework/Actor.h"
7#include <concepts>
8
9#include "CK_UE.h"
11#include "SpawnHub.generated.h"
12
16
17template <typename T>
18concept CSpawnSystem = std::derived_from<T, UActorComponent> && std::derived_from<T, ISpawnSystemInterface>;
19
20
25UCLASS()
26class CK_UE_API ASpawnHub : public AActor
27{
28 GENERATED_BODY()
29
30public:
31 void InitializeHub(UStageManagementSubsystem* InStageManager);
32 void RegisterSpawnSystem(UActorComponent* SpawnSystem);
33 void UnregisterSpawnSystem(UActorComponent* SpawnSystem);
34
35 TArray<ITargetableInterface*> GetAllSpawnedTargetableEntity() const;
36
37 // 블루프린트에서 사용하는 진입점. C++에서는 GetOrCreateSpawnSystem<T>()를 사용한다.
38 // MustImplement가 클래스 피커를 ISpawnSystemInterface 구현체로 좁힌다.
39 UFUNCTION(BlueprintCallable, Category="SpawnHub", meta=(DeterminesOutputType="SpawnSystemClass"))
40 UActorComponent* GetOrCreateSpawnSystem(UPARAM(meta=(MustImplement="/Script/CK_UE.SpawnSystemInterface")) TSubclassOf<UActorComponent> SpawnSystemClass);
41
42public:
43 template <CSpawnSystem TSpawnSystem>
44 TSpawnSystem* GetSpawnSystem() const;
45
46 template <CSpawnSystem TSpawnSystem>
47 TSpawnSystem* GetOrCreateSpawnSystem();
48
49 // 등록된 스폰 시스템 중 TSpawnSystem 타입인 것들만 추려서 반환한다.
50 template <CSpawnSystem TSpawnSystem>
51 TArray<TSpawnSystem*> GetRegisteredSpawnSystems() const;
52
53private:
54 UPROPERTY(Transient)
55 TWeakObjectPtr<UStageManagementSubsystem> StageManager;
56
57 UPROPERTY(Transient)
58 TArray<TWeakObjectPtr<UActorComponent>> RegisteredSpawnSystems;
59};
60
61
62template <CSpawnSystem TSpawnSystem>
63TSpawnSystem* ASpawnHub::GetSpawnSystem() const
64{
65 TSpawnSystem* SpawnSystem = FindComponentByClass<TSpawnSystem>();
66
67 if (SpawnSystem == nullptr)
68 {
69 LOG_ERROR(LogCK, "%s가 존재하지 않습니다. ", NAMEOF(TSpawnSystem));
70 }
71
72 return SpawnSystem;
73}
74
75
76template <CSpawnSystem TSpawnSystem>
78{
79 TSpawnSystem* SpawnSystem = FindComponentByClass<TSpawnSystem>();
80
81 if (SpawnSystem)
82 {
83 RegisterSpawnSystem(SpawnSystem);
84 return SpawnSystem;
85 }
86
87 SpawnSystem = NewObject<TSpawnSystem>(this, TSpawnSystem::StaticClass());
88 SpawnSystem->RegisterComponent();
89 SpawnSystem->Initialize(StageManager.Get());
90 RegisterSpawnSystem(SpawnSystem);
91 return SpawnSystem;
92}
93
94
95template <CSpawnSystem TSpawnSystem>
96TArray<TSpawnSystem*> ASpawnHub::GetRegisteredSpawnSystems() const
97{
98 TArray<TSpawnSystem*> Result;
99
100 for (const TWeakObjectPtr<UActorComponent>& Weak : RegisteredSpawnSystems)
101 {
102 if (TSpawnSystem* SpawnSystem = Cast<TSpawnSystem>(Weak.Get()))
103 {
104 Result.Add(SpawnSystem);
105 }
106 }
107
108 return Result;
109}
#define LOG_ERROR(Category, Format,...)
Definition CK_UE.h:40
#define NAMEOF(Type)
Definition CK_UE.h:30
Definition SpawnHub.h:27
TArray< TWeakObjectPtr< UActorComponent > > RegisteredSpawnSystems
Definition SpawnHub.h:58
TWeakObjectPtr< UStageManagementSubsystem > StageManager
Definition SpawnHub.h:55
TSpawnSystem * GetOrCreateSpawnSystem()
Definition SpawnHub.h:77
void RegisterSpawnSystem(UActorComponent *SpawnSystem)
Definition SpawnHub.cpp:24
TArray< TSpawnSystem * > GetRegisteredSpawnSystems() const
Definition SpawnHub.h:96
Definition CK_UE.Build.cs:6
Definition TargetableInterface.h:20
Definition EnemySpawnDirectorSystemComponent.h:75
Definition StageManagementSubsystem.h:147
Definition SpawnHub.h:18