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

#include <GA_CombatBase.h>

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

Public 멤버 함수

virtual void OnGiveAbility (const FGameplayAbilityActorInfo *ActorInfo, const FGameplayAbilitySpec &Spec) override
 
virtual void EndAbility (const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo *ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility, bool bWasCancelled) override
 
- UGA_Base(으)로부터 상속된 Public 멤버 함수
 UGA_Base ()
 

Protected 멤버 함수

virtual void ApplyCombatData ()
 
void SetupHitCheckListener ()
 
void OnHitCheckStart (FGameplayEventData Payload)
 
void OnHitCheckEnd (FGameplayEventData Payload)
 
void OnTraceResultCallback (const FGameplayAbilityTargetDataHandle &TargetDataHandle, float CombatDataLevel, int32 CombatHitDataIndex)
 
void OnFinisherResultCallback (const FGameplayAbilityTargetDataHandle &TargetDataHandle, float CombatDataLevel, int32 CombatHitDataIndex)
 
virtual TOptional< FTransform > GetTraceTransformForHitCheck () const
 
void ApplyEffectsToSelf (const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo *ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo)
 
FCombatHitPayload BuildCombatHitPayload (const FCombatHitData &HitData, float DamageMultiplier, bool bRequestKnockback)
 
TArray< FGameplayEffectSpecHandle > BuildCombatEffectSpecs (const FCombatHitData &HitData, float DamageMultiplier)
 
FGameplayEffectSpecHandle BuildEffectSpec (const FCombatEffectData &EffectData, float CombatDataLevel)
 
void PlayCombatHitAudio (const FVector &HitLocation)
 
void CacheAudioTagComponents ()
 
const FKnockbackDataFindKnockbackData (const FCombatHitData &HitData) const
 
void NotifyCameraHitConfirmed () const
 
float GetAttackSpeedRate () const
 
void UpdateAttackWarpTargetForRange (FName WarpTargetName=FName("Target"))
 
void UpdateAttackWarpTargetForRange (FName WarpTargetName, ITargetableInterface *Target)
 
- UGA_Base(으)로부터 상속된 Protected 멤버 함수
UCharacterMotionWarpingComponentBase * GetMotionWarpingComponent () const
 
void SetupCancelableListener ()
 
void OnCancelableInputDetected (FGameplayEventData Payload)
 
virtual void HandleCancelable (FGameplayEventData Payload)
 
virtual void OnAbilityMontageCompleted ()
 
virtual void OnAbilityMontageInterrupted ()
 
virtual void OnAbilityMontageCancellable ()
 

Protected 속성

TObjectPtr< UCombatDataBaseCombatData
 
float AttackRange = 450.0f
 
float AttackRangeCorrectionDistance = 250.0f
 
float AttackRangeCorrectionInnerOffset = 30.0f
 
TObjectPtr< UAT_TraceActiveTraceTask
 
TArray< TSubclassOf< UGameplayEffect > > SelfEffectClasses
 
FGameplayTag WeaponHitCueTag
 
TArray< TObjectPtr< UAudioEmitterComponent > > CachedAudioTagComponents
 

Private 속성

bool bMovementRotationOverridden = false
 
bool bCachedOrientRotationToMovement = true
 
bool bCachedUseControllerDesiredRotation = false
 

멤버 함수 문서화

◆ ApplyCombatData()

void UGA_CombatBase::ApplyCombatData ( )
protectedvirtual

UGA_BossSectionPattern, UGA_EnemyAttack, UGA_EnemyDashAttack, UGA_EnemyRangedAttack, UGA_Attack, UGA_Skill_Charge, UGA_Skill_StarFall, UGA_Skill_StarField, UGA_Skill_StrikeBase, UGA_SkillBase에서 재구현되었습니다.

40{
41 if (CombatData == nullptr)
42 {
43 return;
44 }
45
46 SelfEffectClasses = CombatData->SelfEffectClasses;
47}
TObjectPtr< UCombatDataBase > CombatData
Definition GA_CombatBase.h:75
TArray< TSubclassOf< UGameplayEffect > > SelfEffectClasses
Definition GA_CombatBase.h:90
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ApplyEffectsToSelf()

void UGA_CombatBase::ApplyEffectsToSelf ( const FGameplayAbilitySpecHandle  Handle,
const FGameplayAbilityActorInfo *  ActorInfo,
const FGameplayAbilityActivationInfo  ActivationInfo 
)
protected
266{
267 for (const TSubclassOf<UGameplayEffect>& EffectClass : SelfEffectClasses)
268 {
269 if (!EffectClass)
270 {
271 continue;
272 }
273
274 FGameplayEffectSpecHandle SpecHandle = MakeOutgoingGameplayEffectSpec(EffectClass, GetAbilityLevel());
275 if (SpecHandle.IsValid())
276 {
277 (void)ApplyGameplayEffectSpecToOwner(Handle, ActorInfo, ActivationInfo, SpecHandle);
278 }
279 }
280}
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ BuildCombatEffectSpecs()

TArray< FGameplayEffectSpecHandle > UGA_CombatBase::BuildCombatEffectSpecs ( const FCombatHitData HitData,
float  DamageMultiplier 
)
protected
303{
304 TArray<FGameplayEffectSpecHandle> EffectSpecs;
305
306 if (CurrentActorInfo == nullptr || IsValid(CombatData) == false)
307 {
308 return EffectSpecs;
309 }
310
311 const float CombatDataLevel = HitData.GetCombatDataLevel();
312 const FGameplayTag& DamageTypeTag = HitData.GetDamageTypeTag();
313 const TArray<FCombatEffectData>& AdditionalTargetEffects = CombatData->GetAdditionalTargetEffects();
314 EffectSpecs.Reserve(AdditionalTargetEffects.Num() + 1); // 메모리 용량(Capacitry) 확보 -> AddtionalTargetEffects에다가 + 데미지 Spec
315
316 FGameplayEffectSpecHandle DamageEffectSpec = BuildEffectSpec(CombatData->GetDamageEffect(), CombatDataLevel);
317 if (DamageEffectSpec.IsValid())
318 {
319 DamageEffectSpec.Data->SetSetByCallerMagnitude(TAG_DATA_DAMAGE_MUL, DamageMultiplier);
320
321 if (WeaponHitCueTag.IsValid())
322 {
323 DamageEffectSpec.Data->AddDynamicAssetTag(WeaponHitCueTag);
324 }
325
326 if (DamageTypeTag.IsValid())
327 {
328 DamageEffectSpec.Data->AddDynamicAssetTag(DamageTypeTag);
329 }
330
331 EffectSpecs.Add(MoveTemp(DamageEffectSpec));
332 }
333
334 for (const FCombatEffectData& AdditionalEffect : AdditionalTargetEffects)
335 {
336 FGameplayEffectSpecHandle EffectSpec = BuildEffectSpec(AdditionalEffect, CombatDataLevel);
337 if (EffectSpec.IsValid())
338 {
339 EffectSpecs.Add(MoveTemp(EffectSpec));
340 }
341 }
342
343 return EffectSpecs;
344}
FGameplayTag WeaponHitCueTag
Definition GA_CombatBase.h:93
FGameplayEffectSpecHandle BuildEffectSpec(const FCombatEffectData &EffectData, float CombatDataLevel)
Definition GA_CombatBase.cpp:347
Definition CombatDataBase.h:98
FORCEINLINE const FGameplayTag & GetDamageTypeTag() const
Definition CombatDataBase.h:69
FORCEINLINE float GetCombatDataLevel() const
Definition CombatDataBase.h:68
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ BuildCombatHitPayload()

FCombatHitPayload UGA_CombatBase::BuildCombatHitPayload ( const FCombatHitData HitData,
float  DamageMultiplier,
bool  bRequestKnockback 
)
protected
284{
285 FCombatHitPayload HitPayload;
286
287 HitPayload.EffectSpecs = BuildCombatEffectSpecs(HitData, DamageMultiplier);
288 HitPayload.SourceAbilitySystemComponent = GetAbilitySystemComponentFromActorInfo();
289 HitPayload.SourceActor = GetAvatarActorFromActorInfo();
290
291 const FKnockbackData* KnockbackData = bRequestKnockback ? FindKnockbackData(HitData) : nullptr;
292 if (KnockbackData)
293 {
294 HitPayload.KnockbackData = *KnockbackData;
295 HitPayload.bCauseKnockback = true;
296 }
297
298 return HitPayload;
299}
const FKnockbackData * FindKnockbackData(const FCombatHitData &HitData) const
Definition GA_CombatBase.cpp:470
TArray< FGameplayEffectSpecHandle > BuildCombatEffectSpecs(const FCombatHitData &HitData, float DamageMultiplier)
Definition GA_CombatBase.cpp:302
Definition CombatHitPayload.h:15
TArray< FGameplayEffectSpecHandle > EffectSpecs
Definition CombatHitPayload.h:18
FKnockbackData KnockbackData
Definition CombatHitPayload.h:19
bool bCauseKnockback
Definition CombatHitPayload.h:20
TWeakObjectPtr< UAbilitySystemComponent > SourceAbilitySystemComponent
Definition CombatHitPayload.h:16
TWeakObjectPtr< AActor > SourceActor
Definition CombatHitPayload.h:17
Definition KnockbackData.h:11
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ BuildEffectSpec()

FGameplayEffectSpecHandle UGA_CombatBase::BuildEffectSpec ( const FCombatEffectData EffectData,
float  CombatDataLevel 
)
protected
348{
349 const TSubclassOf<UGameplayEffect> EffectClass = EffectData.GetEffectClass();
350 if (IsValid(EffectClass) == false)
351 {
352 return FGameplayEffectSpecHandle();
353 }
354
355 FGameplayEffectSpecHandle EffectSpec = MakeOutgoingGameplayEffectSpec(EffectClass, CombatDataLevel);
356 if (EffectSpec.IsValid() == false)
357 {
358 return FGameplayEffectSpecHandle();
359 }
360
361 for (const TPair<FGameplayTag, FScalableFloat>& SetByCallerPair : EffectData.GetSetByCallerMagnitudes())
362 {
363 if (SetByCallerPair.Key.IsValid() == false)
364 {
365 continue;
366 }
367
368 const float ConfiguredMagnitude = SetByCallerPair.Value.GetValueAtLevel(CombatDataLevel);
369 EffectSpec.Data->SetSetByCallerMagnitude(SetByCallerPair.Key, ConfiguredMagnitude);
370 }
371
372 return EffectSpec;
373}
FORCEINLINE TSubclassOf< UGameplayEffect > GetEffectClass() const
Definition CombatDataBase.h:102
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ CacheAudioTagComponents()

void UGA_CombatBase::CacheAudioTagComponents ( )
protected
377{
379
380 AActor* Attacker = GetAvatarActorFromActorInfo();
381 if (Attacker == nullptr)
382 {
383 return;
384 }
385
386 TArray<UAudioEmitterComponent*> AudioTagComponents;
387 Attacker->GetComponents<UAudioEmitterComponent>(AudioTagComponents);
388
389 for (UAudioEmitterComponent* AudioTagComponent : AudioTagComponents)
390 {
391 if (AudioTagComponent == nullptr)
392 {
393 continue;
394 }
395
396 CachedAudioTagComponents.Add(AudioTagComponent);
397 }
398}
TArray< TObjectPtr< UAudioEmitterComponent > > CachedAudioTagComponents
Definition GA_CombatBase.h:96
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ EndAbility()

void UGA_CombatBase::EndAbility ( const FGameplayAbilitySpecHandle  Handle,
const FGameplayAbilityActorInfo *  ActorInfo,
const FGameplayAbilityActivationInfo  ActivationInfo,
bool  bReplicateEndAbility,
bool  bWasCancelled 
)
overridevirtual

UGA_Base(으)로부터 재구현되었습니다.

UGA_BossSectionPattern, UGA_EnemyAttack, UGA_EnemyDashAttack, UGA_EnemyRangedAttack, UGA_Attack, UGA_Dash, UGA_Skill_Charge, UGA_Skill_StarFall, UGA_Skill_StarField, UGA_Skill_StrikeBase에서 재구현되었습니다.

51{
53 {
54 ActiveTraceTask->EndTask();
55 ActiveTraceTask = nullptr;
56 }
57
58 Super::EndAbility(Handle, ActorInfo, ActivationInfo, bReplicateEndAbility, bWasCancelled);
59}
TObjectPtr< UAT_Trace > ActiveTraceTask
Definition GA_CombatBase.h:87
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ FindKnockbackData()

const FKnockbackData * UGA_CombatBase::FindKnockbackData ( const FCombatHitData HitData) const
protected
471{
472 const UKnockbackDataAsset* KnockbackDataAsset = HitData.GetKnockbackData();
473
474 if (IsValid(KnockbackDataAsset) == false)
475 {
476 return nullptr;
477 }
478
479 return &KnockbackDataAsset->GetKnockbackData();
480}
Definition KnockbackData.h:39
FORCEINLINE const FKnockbackData & GetKnockbackData() const
Definition KnockbackData.h:43
FORCEINLINE UKnockbackDataAsset * GetKnockbackData() const
Definition CombatDataBase.h:73
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetAttackSpeedRate()

float UGA_CombatBase::GetAttackSpeedRate ( ) const
protected
484{
485 const UAbilitySystemComponent* ASC = GetAbilitySystemComponentFromActorInfo();
486
487 if (!ASC)
488 {
489 return 1.0f;
490 }
491
492 const UBaseAttributeSet* BaseSet = ASC->GetSet<UBaseAttributeSet>();
493
494 if (!BaseSet)
495 {
496 return 1.0f;
497 }
498
499 float AttackSpeed = BaseSet->GetAttackSpeed();
500 return (AttackSpeed > 0.0f) ? AttackSpeed : 1.0f;
501}
Definition BaseAttributeSet.h:58
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetTraceTransformForHitCheck()

TOptional< FTransform > UGA_CombatBase::GetTraceTransformForHitCheck ( ) const
protectedvirtual

UGA_BossSectionPattern에서 재구현되었습니다.

144{
145 return TOptional<FTransform>();
146}
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ NotifyCameraHitConfirmed()

void UGA_CombatBase::NotifyCameraHitConfirmed ( ) const
protected
430{
431 const APawn* AvatarPawn = Cast<APawn>(GetAvatarActorFromActorInfo());
432
433 if (!AvatarPawn)
434 {
435 return;
436 }
437
438 const APlayerController* PC = Cast<APlayerController>(AvatarPawn->GetController());
439
440 if (!PC)
441 {
442 return;
443 }
444
445 AGameCameraManager* CameraManager = Cast<AGameCameraManager>(PC->PlayerCameraManager);
446
447 if (!CameraManager)
448 {
449 return;
450 }
451
452 CameraManager->NotifyHitConfirmed();
453}
Definition GameCameraManager.h:28
void NotifyHitConfirmed()
Definition GameCameraManager.cpp:326
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnFinisherResultCallback()

void UGA_CombatBase::OnFinisherResultCallback ( const FGameplayAbilityTargetDataHandle &  TargetDataHandle,
float  CombatDataLevel,
int32  CombatHitDataIndex 
)
protected
220{
221 if (TargetDataHandle.Data.IsEmpty())
222 {
223 return;
224 }
225
226 const FCombatHitData* HitData = IsValid(CombatData) ? CombatData->FindCombatHitData(CombatHitDataIndex) : nullptr;
227 if (HitData == nullptr)
228 {
229 LOG_ERROR(LogCKAbility, "CombatHitData가 없습니다. CombatData=%s Index=%d", *GetNameSafe(CombatData), CombatHitDataIndex);
230 return;
231 }
232
233 if (HitData->GetHitType() != ECombatHitType::MultiHit)
234 {
235 return;
236 }
237
238 const UDA_MultiHitProfile* Profile = HitData->GetMultiHitData().GetProfile();
239 if (IsValid(Profile) == false)
240 {
241 return;
242 }
243
244 // 막타는 전용 데미지 배율과 넉백 설정을 사용한다.
245 const FCombatHitPayload HitPayload = BuildCombatHitPayload(*HitData, Profile->GetFinisherDamageRatio(), Profile->ShouldCauseKnockBack(true));
246 if (HitPayload.IsValid() == false)
247 {
248 return;
249 }
250
251 const FCombatHitApplyResult ApplyResult = FCombatHitProcessor::ApplyToTargetData(HitPayload, TargetDataHandle);
252 if (ApplyResult.HasAppliedHit() == false)
253 {
254 return;
255 }
256
257 if (Profile->ShouldCauseHitStop(true))
258 {
260 }
261
263}
#define LOG_ERROR(Category, Format,...)
Definition CK_UE.h:40
static FCombatHitApplyResult ApplyToTargetData(const FCombatHitPayload &Payload, const FGameplayAbilityTargetDataHandle &TargetDataHandle)
Definition CombatHitProcessor.cpp:15
Definition MultiHitProfile.h:23
FORCEINLINE float GetFinisherDamageRatio() const
Definition MultiHitProfile.h:28
FORCEINLINE bool ShouldCauseHitStop(const bool bIsFinisher) const
Definition MultiHitProfile.h:30
FORCEINLINE bool ShouldCauseKnockBack(const bool bIsFinisher) const
Definition MultiHitProfile.h:35
FCombatHitPayload BuildCombatHitPayload(const FCombatHitData &HitData, float DamageMultiplier, bool bRequestKnockback)
Definition GA_CombatBase.cpp:283
void PlayCombatHitAudio(const FVector &HitLocation)
Definition GA_CombatBase.cpp:401
void NotifyCameraHitConfirmed() const
Definition GA_CombatBase.cpp:429
Definition CombatHitProcessor.h:15
FVector FirstHitLocation
Definition CombatHitProcessor.h:17
FORCEINLINE bool HasAppliedHit() const
Definition CombatHitProcessor.h:19
Definition CombatDataBase.h:64
FORCEINLINE ECombatHitType GetHitType() const
Definition CombatDataBase.h:70
FORCEINLINE const FMultiHitData & GetMultiHitData() const
Definition CombatDataBase.h:72
bool IsValid() const
Definition CombatHitPayload.h:27
FORCEINLINE UDA_MultiHitProfile * GetProfile() const
Definition CombatDataBase.h:51
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ OnGiveAbility()

void UGA_CombatBase::OnGiveAbility ( const FGameplayAbilityActorInfo *  ActorInfo,
const FGameplayAbilitySpec &  Spec 
)
overridevirtual

UGA_Dash에서 재구현되었습니다.

24{
25 Super::OnGiveAbility(ActorInfo, Spec);
28
29 if (const UWeaponDefinition* WeaponDef = Cast<UWeaponDefinition>(Spec.SourceObject.Get()))
30 {
31 WeaponHitCueTag = WeaponDef->HitCueTag;
32 AttackRange = WeaponDef->AttackRange;
33 AttackRangeCorrectionDistance = WeaponDef->AttackRangeCorrectionDistance;
34 AttackRangeCorrectionInnerOffset = WeaponDef->AttackRangeCorrectionInnerOffset;
35 }
36}
float AttackRange
Definition GA_CombatBase.h:78
float AttackRangeCorrectionDistance
Definition GA_CombatBase.h:81
void CacheAudioTagComponents()
Definition GA_CombatBase.cpp:376
float AttackRangeCorrectionInnerOffset
Definition GA_CombatBase.h:84
virtual void ApplyCombatData()
Definition GA_CombatBase.cpp:39
Definition WeaponDefinition.h:77
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ OnHitCheckEnd()

void UGA_CombatBase::OnHitCheckEnd ( FGameplayEventData  Payload)
protected
150{
151 if (ActiveTraceTask)
152 {
153 ActiveTraceTask->EndTask();
154 ActiveTraceTask = nullptr;
155 }
156}

◆ OnHitCheckStart()

void UGA_CombatBase::OnHitCheckStart ( FGameplayEventData  Payload)
protected
81{
82 if (ActiveTraceTask) // 예외처리: 혹시나 생성된 Task가 있으면 안 되기에
83 {
84 ActiveTraceTask->EndTask();
85 ActiveTraceTask = nullptr;
86 }
87
88 // Payload는 판정 방식과 CombatHitDataIndex만 전달한다.
89 UObject* OptionalObj = const_cast<UObject*>(Payload.OptionalObject.Get());
90 const UAnimNotify_AttackHitCheck* HitNotify = Cast<UAnimNotify_AttackHitCheck>(OptionalObj);
91 const UAnimNotifyState_AttackCollision* HitNotifyState = Cast<UAnimNotifyState_AttackCollision>(OptionalObj);
92 const bool bUseSingleTrace = IsValid(HitNotify);
93 if (bUseSingleTrace == false && IsValid(HitNotifyState) == false)
94 {
95 LOG_ERROR(LogCKAbility, "지원하지 않는 HitCheck Payload입니다: %s", *GetNameSafe(OptionalObj));
96 return;
97 }
98
99 const int32 CombatHitDataIndex = FMath::RoundToInt(Payload.EventMagnitude);
100 const FCombatHitData* HitData = IsValid(CombatData) ? CombatData->FindCombatHitData(CombatHitDataIndex) : nullptr;
101 if (HitData == nullptr)
102 {
103 LOG_ERROR(LogCKAbility, "CombatHitData가 없습니다. CombatData=%s Index=%d", *GetNameSafe(CombatData), CombatHitDataIndex);
104 return;
105 }
106
107 const float CombatDataLevel = HitData->GetCombatDataLevel();
108
109 int32 MaxHitCountPerTarget = 1;
110 UDA_MultiHitProfile* MultiHitProfile = nullptr;
111 if (HitData->GetHitType() == ECombatHitType::MultiHit)
112 {
113 if (bUseSingleTrace)
114 {
115 LOG_ERROR(LogCKAbility, "MultiHit은 AnimNotifyState가 필요합니다. CombatData=%s Index=%d", *GetNameSafe(CombatData), CombatHitDataIndex);
116 return;
117 }
118
119 const FMultiHitData& MultiHitData = HitData->GetMultiHitData();
120 MultiHitProfile = MultiHitData.GetProfile();
121 if (IsValid(MultiHitProfile) == false)
122 {
123 LOG_ERROR(LogCKAbility, "MultiHitProfile이 비어있습니다. CombatData=%s Index=%d", *GetNameSafe(CombatData), CombatHitDataIndex);
124 return;
125 }
126
127 MaxHitCountPerTarget = MultiHitData.GetMaxHitCountPerTarget();
128 }
129
130 const TOptional<FTransform> OptionalTraceTransform = GetTraceTransformForHitCheck();
131 const bool bHasTraceTransform = OptionalTraceTransform.IsSet();
132 const FTransform TraceTransform = bHasTraceTransform ? OptionalTraceTransform.GetValue() : FTransform::Identity;
133
134 ActiveTraceTask = UAT_Trace::CreateTask(this, CombatData, CombatDataLevel, CombatHitDataIndex, bUseSingleTrace, MaxHitCountPerTarget, MultiHitProfile, bHasTraceTransform, TraceTransform);
135 if (ActiveTraceTask)
136 {
137 ActiveTraceTask->OnCompleteDelegate.AddDynamic(this, &ThisClass::OnTraceResultCallback);
138 ActiveTraceTask->OnFinisherCompleteDelegate.AddDynamic(this, &ThisClass::OnFinisherResultCallback);
139 ActiveTraceTask->ReadyForActivation();
140 }
141}
static UAT_Trace * CreateTask(UGameplayAbility *OwningAbility, const UCombatDataBase *InCombatData, float InCombatDataLevel, int32 InCombatHitDataIndex, bool bInSingleTrace=false, int32 InMaxHitCountPerTarget=1, UDA_MultiHitProfile *InMultiHitProfile=nullptr, bool bInHasOverrideTraceTransform=false, const FTransform &InOverrideTraceTransform=FTransform::Identity)
Definition AT_Trace.cpp:14
Definition AnimNotifyState_AttackCollision.h:14
Definition AnimNotify_AttackHitCheck.h:14
virtual TOptional< FTransform > GetTraceTransformForHitCheck() const
Definition GA_CombatBase.cpp:143
Definition CombatDataBase.h:46
FORCEINLINE int32 GetMaxHitCountPerTarget() const
Definition CombatDataBase.h:50
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ OnTraceResultCallback()

void UGA_CombatBase::OnTraceResultCallback ( const FGameplayAbilityTargetDataHandle &  TargetDataHandle,
float  CombatDataLevel,
int32  CombatHitDataIndex 
)
protected
160{
161 if (TargetDataHandle.Data.IsEmpty())
162 {
163 return;
164 }
165
166 const FCombatHitData* HitData = IsValid(CombatData) ? CombatData->FindCombatHitData(CombatHitDataIndex) : nullptr;
167 if (HitData == nullptr)
168 {
169 LOG_ERROR(LogCKAbility, "CombatHitData가 없습니다. CombatData=%s Index=%d", *GetNameSafe(CombatData), CombatHitDataIndex);
170 return;
171 }
172
173 float DamageMultiplier = 1.0f;
174 bool bShouldHitStop = false;
175 bool bRequestKnockback = false;
176
177 if (HitData->GetHitType() == ECombatHitType::Single)
178 {
179 const FSingleHitData& SingleHitData = HitData->GetSingleHitData();
180 DamageMultiplier = SingleHitData.GetDamageMultiplier();
181 bShouldHitStop = SingleHitData.ShouldCauseHitStop();
182 bRequestKnockback = true; // 단타는 KnockbackData 존재 여부로만 결정한다.
183 }
184 else
185 {
186 const UDA_MultiHitProfile* Profile = HitData->GetMultiHitData().GetProfile();
187 if (IsValid(Profile) == false)
188 {
189 return;
190 }
191
192 DamageMultiplier = Profile->GetNormalDamageRatio();
193 bShouldHitStop = Profile->ShouldCauseHitStop(false);
194 bRequestKnockback = Profile->ShouldCauseKnockBack(false);
195 }
196
197 const FCombatHitPayload HitPayload = BuildCombatHitPayload(*HitData, DamageMultiplier, bRequestKnockback);
198 if (HitPayload.IsValid() == false)
199 {
200 return;
201 }
202
203 // 트레이스 결과를 그대로 넘겨 실제 표면 충돌 정보를 보존한다.
204 const FCombatHitApplyResult ApplyResult = FCombatHitProcessor::ApplyToTargetData(HitPayload, TargetDataHandle);
205 if (ApplyResult.HasAppliedHit() == false)
206 {
207 return;
208 }
209
210 if (bShouldHitStop)
211 {
213 }
214
216}
FORCEINLINE float GetNormalDamageRatio() const
Definition MultiHitProfile.h:27
FORCEINLINE const FSingleHitData & GetSingleHitData() const
Definition CombatDataBase.h:71
Definition CombatDataBase.h:28
FORCEINLINE bool ShouldCauseHitStop() const
Definition CombatDataBase.h:33
FORCEINLINE float GetDamageMultiplier() const
Definition CombatDataBase.h:32
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ PlayCombatHitAudio()

void UGA_CombatBase::PlayCombatHitAudio ( const FVector &  HitLocation)
protected
402{
403 AActor* Attacker = GetAvatarActorFromActorInfo();
404 if (Attacker == nullptr)
405 {
406 return;
407 }
408
409 if (CachedAudioTagComponents.IsEmpty())
410 {
412 }
413
414 for (UAudioEmitterComponent* AudioTagComponent : CachedAudioTagComponents)
415 {
416 if (AudioTagComponent == nullptr)
417 {
418 continue;
419 }
420
421 if (AudioTagComponent->PlayAudioTagAtLocation(TAG_AUDIO_SFX_COMBAT_HIT, HitLocation))
422 {
423 break;
424 }
425 }
426}
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SetupHitCheckListener()

void UGA_CombatBase::SetupHitCheckListener ( )
protected
63{
64 UAbilityTask_WaitGameplayEvent* WaitStart = UAbilityTask_WaitGameplayEvent::WaitGameplayEvent(this, TAG_EVENT_COMBAT_HITCHECK_START, nullptr, false, true);
65 if (WaitStart)
66 {
67 WaitStart->EventReceived.AddDynamic(this, &ThisClass::OnHitCheckStart);
68 WaitStart->ReadyForActivation();
69 }
70
71 UAbilityTask_WaitGameplayEvent* WaitEnd = UAbilityTask_WaitGameplayEvent::WaitGameplayEvent(this, TAG_EVENT_COMBAT_HITCHECK_END, nullptr, false, true);
72 if (WaitEnd)
73 {
74 WaitEnd->EventReceived.AddDynamic(this, &ThisClass::OnHitCheckEnd);
75 WaitEnd->ReadyForActivation();
76 }
77}
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ UpdateAttackWarpTargetForRange() [1/2]

void UGA_CombatBase::UpdateAttackWarpTargetForRange ( FName  WarpTargetName,
ITargetableInterface Target 
)
protected
464{
465 UCharacterMotionWarpingComponentBase* Compo = GetMotionWarpingComponent();
467}
static const FName WarpTargetName(TEXT("KnockDown"))
UCharacterMotionWarpingComponentBase * GetMotionWarpingComponent() const
Definition GA_Base.cpp:33
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ UpdateAttackWarpTargetForRange() [2/2]

void UGA_CombatBase::UpdateAttackWarpTargetForRange ( FName  WarpTargetName = FName("Target"))
protected
457{
458 UCharacterMotionWarpingComponentBase* Compo = GetMotionWarpingComponent();
459 Compo->UpdateMotionWarpTargetToNearestTargetAtRange(WarpTargetName, AttackRangeCorrectionDistance, AttackRange, AttackRangeCorrectionInnerOffset);
460}
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ ActiveTraceTask

TObjectPtr<UAT_Trace> UGA_CombatBase::ActiveTraceTask
protected

◆ AttackRange

float UGA_CombatBase::AttackRange = 450.0f
protected

◆ AttackRangeCorrectionDistance

float UGA_CombatBase::AttackRangeCorrectionDistance = 250.0f
protected

◆ AttackRangeCorrectionInnerOffset

float UGA_CombatBase::AttackRangeCorrectionInnerOffset = 30.0f
protected

◆ bCachedOrientRotationToMovement

bool UGA_CombatBase::bCachedOrientRotationToMovement = true
private

◆ bCachedUseControllerDesiredRotation

bool UGA_CombatBase::bCachedUseControllerDesiredRotation = false
private

◆ bMovementRotationOverridden

bool UGA_CombatBase::bMovementRotationOverridden = false
private

◆ CachedAudioTagComponents

TArray<TObjectPtr<UAudioEmitterComponent> > UGA_CombatBase::CachedAudioTagComponents
protected

◆ CombatData

TObjectPtr<UCombatDataBase> UGA_CombatBase::CombatData
protected

◆ SelfEffectClasses

TArray<TSubclassOf<UGameplayEffect> > UGA_CombatBase::SelfEffectClasses
protected

◆ WeaponHitCueTag

FGameplayTag UGA_CombatBase::WeaponHitCueTag
protected

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