Payback 0.0.1
CK Graduation Project
로딩중...
검색중...
일치하는것 없음
CombatDataBase.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 "Engine/DataAsset.h"
7#include "GameplayTagContainer.h"
8#include "ScalableFloat.h"
9#include "StructUtils/InstancedStruct.h"
10#include "CombatDataBase.generated.h"
11
12class ATA_Trace;
13class UGameplayEffect;
16
17
18UENUM()
19enum class ECombatHitType : uint8
20{
21 Single,
23};
24
25
26USTRUCT()
28{
29 GENERATED_BODY()
30
31public:
32 FORCEINLINE float GetDamageMultiplier() const { return DamageMultiplier; }
33 FORCEINLINE bool ShouldCauseHitStop() const { return bCauseHitStop; }
34
35protected:
36 UPROPERTY(EditAnywhere, Category = "SingleHit", meta = (ToolTip = "대상별 1회 타격에 적용할 피해 배율입니다. 1.0은 100%입니다.", ClampMin = "0.0"))
37 float DamageMultiplier = 1.0f;
38
39 UPROPERTY(EditAnywhere, Category = "SingleHit", meta = (ToolTip = "단일 타격 적중 시 히트 스톱 연출을 적용할지 결정합니다."))
40 uint8 bCauseHitStop : 1 = true;
41};
42
43
44USTRUCT()
46{
47 GENERATED_BODY()
48
49public:
50 FORCEINLINE int32 GetMaxHitCountPerTarget() const { return MaxHitCountPerTarget; }
51 FORCEINLINE UDA_MultiHitProfile* GetProfile() const { return Profile; }
52
53protected:
54 UPROPERTY(EditAnywhere, Category = "MultiHit", meta = (ToolTip = "하나의 NotifyState 판정 구간에서 동일 대상을 타격할 수 있는 최대 횟수입니다.", ClampMin = "2"))
55 int32 MaxHitCountPerTarget = 2;
56
57 UPROPERTY(EditAnywhere, Category = "MultiHit", meta = (ToolTip = "일반 타격과 마지막 타격의 피해 배율, 재타격 간격, 히트 스톱 및 넉백 적용 시점을 정의합니다."))
58 TObjectPtr<UDA_MultiHitProfile> Profile;
59};
60
61
62USTRUCT()
64{
65 GENERATED_BODY()
66
67public:
68 FORCEINLINE float GetCombatDataLevel() const { return CombatDataLevel; }
69 FORCEINLINE const FGameplayTag& GetDamageTypeTag() const { return DamageTypeTag; }
70 FORCEINLINE ECombatHitType GetHitType() const { return HitType; }
71 FORCEINLINE const FSingleHitData& GetSingleHitData() const { return SingleHitData; }
72 FORCEINLINE const FMultiHitData& GetMultiHitData() const { return MultiHitData; }
73 FORCEINLINE UKnockbackDataAsset* GetKnockbackData() const { return KnockbackData; }
74
75protected:
76 UPROPERTY(EditAnywhere, Category = "Hit", meta = (ToolTip = "이 타격의 GameplayEffect와 FScalableFloat CurveTable 값을 평가할 때 사용하는 레벨입니다.", ClampMin = "1.0"))
77 float CombatDataLevel = 1.0f;
78
79 UPROPERTY(EditAnywhere, Category = "Hit", meta = (ToolTip = "피격 모션과 Mesh Pulse 등 피해 연출을 선택합니다. 약 경직과 넉다운 적용 여부는 GameplayEffect 설정을 따릅니다.", Categories = "Damage.Type"))
80 FGameplayTag DamageTypeTag;
81
82 UPROPERTY(EditAnywhere, Category = "Hit", meta = (ToolTip = "판정 구간에서 동일 대상을 한 번만 타격할지 반복 타격할지 결정합니다. Notify와 NotifyState는 판정 지속 방식을 결정합니다."))
84
85 UPROPERTY(EditAnywhere, Category = "Hit", meta = (ToolTip = "대상별 1회 타격에 사용할 피해 배율과 히트 스톱 설정입니다.", EditCondition = "HitType == ECombatHitType::Single", EditConditionHides))
86 FSingleHitData SingleHitData;
87
88 UPROPERTY(EditAnywhere, Category = "Hit", meta = (ToolTip = "동일 대상을 반복 타격할 때 사용할 최대 횟수와 다단 타격 프로필입니다.", EditCondition = "HitType == ECombatHitType::MultiHit", EditConditionHides))
89 FMultiHitData MultiHitData;
90
91 UPROPERTY(EditAnywhere, Instanced, Category = "Hit|Impact", meta = (ToolTip = "적중 대상에게 적용할 넉백 설정입니다. 비워두면 넉백을 적용하지 않습니다."))
92 TObjectPtr<UKnockbackDataAsset> KnockbackData;
93};
94
95
96USTRUCT()
98{
99 GENERATED_BODY()
100
101public:
102 FORCEINLINE TSubclassOf<UGameplayEffect> GetEffectClass() const { return EffectClass; }
103 FORCEINLINE const TMap<FGameplayTag, FScalableFloat>& GetSetByCallerMagnitudes() const { return SetByCallerMagnitudes; }
104
105protected:
106 UPROPERTY(EditAnywhere, Category = "Effect", meta = (ToolTip = "적중한 대상에게 적용할 GameplayEffect입니다."))
107 TSubclassOf<UGameplayEffect> EffectClass;
108
109 UPROPERTY(EditAnywhere, Category = "Effect", meta = (ToolTip = "GameplayEffect에 전달할 Data 태그별 기본값입니다.", Categories = "Data"))
110 TMap<FGameplayTag, FScalableFloat> SetByCallerMagnitudes;
111};
112
113
114UCLASS()
115class CK_UE_API UCombatDataBase : public UPrimaryDataAsset
116{
117 GENERATED_BODY()
118
119public:
120 template <typename T>
121 const T* FindExtendedData() const;
122
123 FORCEINLINE const FCombatEffectData& GetDamageEffect() const { return DamageEffect; }
124 FORCEINLINE const TArray<FCombatEffectData>& GetAdditionalTargetEffects() const { return AdditionalTargetEffects; }
125 FORCEINLINE const FCombatHitData* FindCombatHitData(const int32 CombatHitDataIndex) const
126 {
127 const int32 ArrayIndex = CombatHitDataIndex - 1;
128 return CombatHitData.IsValidIndex(ArrayIndex) ? &CombatHitData[ArrayIndex] : nullptr;
129 }
130
131public:
132 // --- Combat ---
133 UPROPERTY(EditDefaultsOnly, Category = "Combat", meta = (ToolTip = "공격의 충돌 검사에 사용할 Collision Trace Channel입니다."))
134 TEnumAsByte<ECollisionChannel> TraceChannel;
135
136 UPROPERTY(EditDefaultsOnly, Category = "Combat", meta = (ToolTip = "공격의 충돌 판정을 수행할 Trace Actor 클래스입니다."))
137 TSubclassOf<ATA_Trace> HitTraceClass;
138
139 UPROPERTY(EditDefaultsOnly, Category = "Combat", meta = (ToolTip = "Ability 실행 시 시전자 자신에게 적용할 GameplayEffect 목록입니다."))
140 TArray<TSubclassOf<UGameplayEffect>> SelfEffectClasses;
141
142protected:
143 UPROPERTY(EditDefaultsOnly, Category = "Combat|Effect", meta = (ToolTip = "피해 계산과 HitEffect, DamageType 전달에 사용할 GameplayEffect입니다."))
144 FCombatEffectData DamageEffect;
145
146 UPROPERTY(EditDefaultsOnly, Category = "Combat|Effect", meta = (ToolTip = "피해 외에 적중 대상에게 적용할 HitStun, Groggy, KnockDown 등의 GameplayEffect 목록입니다."))
147 TArray<FCombatEffectData> AdditionalTargetEffects;
148
149 // CombatHitDataIndex 1은 [0], 2는 [1], 3은 [2]에 대응한다.
150 UPROPERTY(EditDefaultsOnly, Category = "Combat|Hit", meta = (ToolTip = "공격의 타격 단계별 설정입니다. Notify의 CombatHitDataIndex 1은 배열 요소 0에 대응합니다."))
151 TArray<FCombatHitData> CombatHitData;
152
153 // --- Payload ---
154 UPROPERTY(EditDefaultsOnly, Category = "Payload", meta = (ToolTip = "몽타주, 스킬, 돌진, 보스 패턴처럼 해당 Ability에만 필요한 확장 데이터를 추가합니다.", BaseStruct = "/Script/CK_UE.CombatExtendedData", ExcludeBaseStruct))
155 TArray<FInstancedStruct> ExtendedData;
156
157protected:
158 UPROPERTY(Transient)
159 mutable TMap<TObjectPtr<UScriptStruct>, int32> CachedIndices;
160};
161
162
163// 확장 데이터 검색 헬퍼 함수
164template <typename T>
165inline const T* UCombatDataBase::FindExtendedData() const
166{
167 if (const int32* CachedIndex = CachedIndices.Find(T::StaticStruct()))
168 {
169 return ExtendedData[*CachedIndex].GetPtr<T>();
170 }
171
172 for (int32 i = 0; i < ExtendedData.Num(); ++i)
173 {
174 if (const T* Data = ExtendedData[i].GetPtr<T>())
175 {
176 CachedIndices.Add(T::StaticStruct(), i);
177 return Data;
178 }
179 }
180
181 return nullptr;
182}
ECombatHitType
Definition CombatDataBase.h:20
Definition TA_Trace.h:29
Definition CK_UE.Build.cs:6
Definition CombatDataBase.h:116
FORCEINLINE const FCombatEffectData & GetDamageEffect() const
Definition CombatDataBase.h:123
FORCEINLINE const TArray< FCombatEffectData > & GetAdditionalTargetEffects() const
Definition CombatDataBase.h:124
FORCEINLINE const FCombatHitData * FindCombatHitData(const int32 CombatHitDataIndex) const
Definition CombatDataBase.h:125
Definition MultiHitProfile.h:23
Definition KnockbackData.h:39
Definition CombatDataBase.h:98
FORCEINLINE const TMap< FGameplayTag, FScalableFloat > & GetSetByCallerMagnitudes() const
Definition CombatDataBase.h:103
FORCEINLINE TSubclassOf< UGameplayEffect > GetEffectClass() const
Definition CombatDataBase.h:102
Definition CombatDataBase.h:64
FORCEINLINE const FSingleHitData & GetSingleHitData() const
Definition CombatDataBase.h:71
FORCEINLINE UKnockbackDataAsset * GetKnockbackData() const
Definition CombatDataBase.h:73
FORCEINLINE ECombatHitType GetHitType() const
Definition CombatDataBase.h:70
FORCEINLINE const FGameplayTag & GetDamageTypeTag() const
Definition CombatDataBase.h:69
FORCEINLINE float GetCombatDataLevel() const
Definition CombatDataBase.h:68
FORCEINLINE const FMultiHitData & GetMultiHitData() const
Definition CombatDataBase.h:72
Definition CombatDataBase.h:46
FORCEINLINE int32 GetMaxHitCountPerTarget() const
Definition CombatDataBase.h:50
FORCEINLINE UDA_MultiHitProfile * GetProfile() const
Definition CombatDataBase.h:51
Definition CombatDataBase.h:28
FORCEINLINE bool ShouldCauseHitStop() const
Definition CombatDataBase.h:33
FORCEINLINE float GetDamageMultiplier() const
Definition CombatDataBase.h:32