Payback 0.0.1
CK Graduation Project
로딩중...
검색중...
일치하는것 없음
CharacterControlData.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 "StructUtils/InstancedStruct.h"
9#include "TweenTypes.h"
10#include "CharacterControlData.generated.h"
11
12class UInputMappingContext;
13class UInputAction;
14class UGameplayAbility;
15class UGameplayEffect;
16class UAnimMontage;
17class UDataTable;
18
19USTRUCT(BlueprintType)
21{
22 GENERATED_BODY()
23};
24
25// 피격 메시 확대 연출의 재생 방식.
26UENUM(BlueprintType)
27enum class EHitPulseMode : uint8
28{
29 // 첫 프레임에 즉시 확대된 뒤 남은 시간 동안 원래 크기로 감쇠한다. 타격 순간이 가장 또렷하다.
30 OneWay UMETA(DisplayName = "단방향 (즉시 확대 후 감쇠)"),
31
32 // 원본에서 커졌다가 되돌아온다. 상승과 하강에 같은 시간이 배분된다.
33 PingPong UMETA(DisplayName = "PingPong (대칭)"),
34
35 // 왕복 모양을 곡선으로 직접 그린다. 상승과 하강 시간을 다르게 줄 수 있다.
36 CustomCurve UMETA(DisplayName = "PingPong (곡선 직접 지정)")
37};
38
39// 피격 시 메시만 순간 커졌다 원래 크기로 돌아오는 연출 설정.
40// 액터와 캡슐 크기는 건드리지 않으므로 공격 판정에 영향을 주지 않는다.
41USTRUCT(BlueprintType)
43{
44 GENERATED_BODY()
45
46 // 연출 사용 여부.
47 UPROPERTY(EditDefaultsOnly, Category = "Hit Mesh Pulse")
48 uint8 bEnabled : 1 = false;
49
50 // 재생 방식.
51 UPROPERTY(EditDefaultsOnly, Category = "Hit Mesh Pulse", meta = (EditCondition = "bEnabled"))
53
54 // 원본 메시 크기 대비 축별 배율. 1보다 크면 늘어나고 작으면 눌린다.
55 // X/Y를 키우고 Z를 줄이면 옆으로 퍼지며 납작해지는 Squash, 반대로 하면 위로 솟는 Stretch가 된다.
56 // 모든 축을 같은 값으로 두면 균등 확대로 동작한다.
57 UPROPERTY(EditDefaultsOnly, Category = "Hit Mesh Pulse", meta = (EditCondition = "bEnabled"))
58 FVector ScaleMultiplier = FVector(1.08f, 1.08f, 0.94f);
59
60 // 확대에서 원래 크기 복귀까지의 전체 시간.
61 UPROPERTY(EditDefaultsOnly, Category = "Hit Mesh Pulse", meta = (ClampMin = "0.0", EditCondition = "bEnabled"))
62 float Duration = 0.1f;
63
64 // 왕복에서 정점에 머무는 시간. 히트스톱과 겹치면 타격감이 살아난다.
65 UPROPERTY(EditDefaultsOnly, Category = "Hit Mesh Pulse", meta = (ClampMin = "0.0", EditCondition = "bEnabled && Mode == EHitPulseMode::PingPong"))
66 float PeakHoldTime = 0.03f;
67
68 // 보간 곡선. 왕복이면 InOut 계열(InOutSine 등), 단방향이면 Out 계열(OutQuart 등)이 어울린다.
69 UPROPERTY(EditDefaultsOnly, Category = "Hit Mesh Pulse", meta = (EditCondition = "bEnabled && Mode != EHitPulseMode::CustomCurve"))
70 ETweenEase Ease = ETweenEase::OutExpo;
71
72 // 왕복 모양을 담은 곡선. 0에서 1로 올랐다가 0으로 내려오도록 그린다.
73 // 정점 키의 시간 위치가 상승과 하강의 시간 비율이 되므로, 뒤로 옮길수록 천천히 부풀었다 빠르게 꺼진다.
74 // 키가 2개 미만이면 Linear로 폴백하므로 최소 3개(시작 / 정점 / 끝)를 찍어야 한다.
75 UPROPERTY(EditDefaultsOnly, Category = "Hit Mesh Pulse", meta = (EditCondition = "bEnabled && Mode == EHitPulseMode::CustomCurve"))
76 FRuntimeFloatCurve CustomCurve;
77};
78
79// 플레이어 전용 확장 데이터
80USTRUCT(BlueprintType)
82{
83 GENERATED_BODY()
84
85 // --- 입력 ---
86 UPROPERTY(EditDefaultsOnly)
87 TObjectPtr<UInputMappingContext> DefaultMappingContext;
88
89 UPROPERTY(EditDefaultsOnly)
90 TObjectPtr<UInputAction> DashAction;
91
92 UPROPERTY(EditDefaultsOnly)
93 TObjectPtr<UInputAction> MoveAction;
94
95 UPROPERTY(EditDefaultsOnly)
96 TObjectPtr<UInputAction> AttackAction;
97
98 UPROPERTY(EditDefaultsOnly)
99 TObjectPtr<UInputAction> WarpStrikeAction;
100
101 UPROPERTY(EditDefaultsOnly)
102 TObjectPtr<UInputAction> WeaponRequestSkillAction;
103
104 UPROPERTY(EditDefaultsOnly)
105 TObjectPtr<UInputAction> Weapon_SkillAction;
106
107 UPROPERTY(EditDefaultsOnly)
108 TObjectPtr<UInputAction> Cam_LockOnAction;
109
110 UPROPERTY(EditDefaultsOnly)
111 TObjectPtr<UInputAction> Cam_RotationAction;
112
113 UPROPERTY(EditDefaultsOnly)
114 TObjectPtr<UInputAction> Cam_WheelAction;
115
116 // --- GAS ---
117 UPROPERTY(EditDefaultsOnly, meta = (Categories = "Input", ForceInlineRow))
118 TMap<FGameplayTag, TSubclassOf<UGameplayAbility>> StartInputAbilities;
119
120 // 피격 시 적용할 GE. 일정 시간 Attack Idle 상태를 유지.
121 UPROPERTY(EditDefaultsOnly, Category = "HitReact")
122 TSubclassOf<UGameplayEffect> DamageTakenEffectClass;
123
124 // 히트 -> KnockDown 유효 시간
125 UPROPERTY(EditDefaultsOnly, Category = "HitReact|KnockDown", meta = (ClampMin = "0.0"))
126 float HitToKnockDownWindow = 5.0f;
127
128 // 히트 -> KnockDown 횟수
129 UPROPERTY(EditDefaultsOnly, Category = "HitReact|KnockDown", meta = (ClampMin = "2"))
130 int32 HitToKnockDownThreshold = 5;
131
132 // --- 시작 무기 ---
133 // 비어 있으면 시작 시점 자동 장착을 건너뛴다.
134 UPROPERTY(EditDefaultsOnly, Category = "Weapon", meta = (Categories = "Weapon"))
135 FGameplayTag DefaultWeaponTag;
136};
137
138
139// 적 전용 확장 데이터
140USTRUCT(BlueprintType)
142{
143 GENERATED_BODY()
144
145 // --- AI 데이터 테이블 ---
146 UPROPERTY(EditDefaultsOnly, Category = "AI")
147 TObjectPtr<UDataTable> EnemyAICombatTable;
148
149 UPROPERTY(EditDefaultsOnly, Category = "AI")
150 TObjectPtr<UDataTable> EnemyAIRetreatTable;
151
152 UPROPERTY(EditDefaultsOnly, Category = "AI")
153 TObjectPtr<UDataTable> EnemyAIStrafeTable;
154
155 UPROPERTY(EditDefaultsOnly, Category = "Animation")
156 TObjectPtr<UAnimMontage> HitReactMontage;
157
158 UPROPERTY(EditDefaultsOnly, Category = "Animation")
159 TObjectPtr<UAnimMontage> DeadMontage;
160
161 UPROPERTY(EditDefaultsOnly, Category = "Groggy")
162 TObjectPtr<UDataTable> GroggyTable;
163
164 UPROPERTY(EditDefaultsOnly, Category = "Groggy")
165 TObjectPtr<UAnimMontage> GroggyMontage;
166
167 UPROPERTY(EditDefaultsOnly, Category = "Groggy")
168 FName GroggyEndSectionName = FName("Groggy_End");
169
170 UPROPERTY(EditDefaultsOnly, Category = "Hit Visual", meta = (Categories = "Damage.Type"))
171 TMap<FGameplayTag, FHitMeshPulseData> HitMeshPulseByDamageType;
172};
173
174USTRUCT(BlueprintType)
176{
177 GENERATED_BODY()
178};
179
180UCLASS()
181class CK_UE_API UCharacterControlData : public UPrimaryDataAsset
182{
183 GENERATED_BODY()
184
185public:
187
188public:
189 // 확장 데이터 검색 헬퍼 함수
190 template <class T>
191 const T* FindExtendedData() const;
192
193 // --- 데이터 테이블 ---
194 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Stat)
195 TObjectPtr<UDataTable> StatTable;
196
197 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Stat)
198 FName StatRowName;
199
200 // --- GAS ---
201 UPROPERTY(EditAnywhere, Category = GAS)
202 TArray<TSubclassOf<UGameplayAbility>> StartAbilities;
203
204 // --- 확장 데이터 ---
205 UPROPERTY(EditAnywhere, Category = "Extended", meta = (BaseStruct = "/Script/CK_UE.CharacterExtendedDataBase", ExcludeBaseStruct))
206 TArray<FInstancedStruct> ExtendedData;
207
208protected:
209 UPROPERTY(Transient)
210 mutable TMap<TObjectPtr<UScriptStruct>, int32> CachedIndices;
211};
212
213
214// 확장 데이터 검색 헬퍼 함수
215template <typename T>
216inline const T* UCharacterControlData::FindExtendedData() const
217{
218 if (const int32* CachedIndex = CachedIndices.Find(T::StaticStruct()))
219 {
220 return ExtendedData[*CachedIndex].GetPtr<T>();
221 }
222
223 for (int32 i = 0; i < ExtendedData.Num(); ++i)
224 {
225 if (const T* Data = ExtendedData[i].GetPtr<T>())
226 {
227 CachedIndices.Add(T::StaticStruct(), i);
228 return Data;
229 }
230 }
231
232 return nullptr;
233}
EHitPulseMode
Definition CharacterControlData.h:28
Definition CK_UE.Build.cs:6
Definition CharacterControlData.h:182
Definition CharacterControlData.h:176
Definition CharacterControlData.h:21
Definition CharacterControlData.h:142
Definition CharacterControlData.h:43
Definition CharacterControlData.h:82