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

#include <GA_Skill_StarField.h>

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

Public 멤버 함수

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

Protected 멤버 함수

virtual void ApplyCombatData () override
 
bool ResolveWeaponLocation (const FGameplayEventData *TriggerEventData, FVector &OutLocation) const
 
void PerformPullAtLocation (const FVector &WeaponLocation, AActor *Avatar, bool bApplyAreaEffects)
 
void OnPullDurationFinished ()
 
void OnPullTick ()
 
void ClearPullState ()
 
- UGA_SkillBase(으)로부터 상속된 Protected 멤버 함수
virtual bool CheckCost (const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo *ActorInfo, FGameplayTagContainer *OptionalRelevantTags) const override
 
virtual void ApplyCost (const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo *ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo) const override
 
float GetSkillMontageSectionLength (const UAnimMontage *Montage, FName SectionName, bool bApplyPlayRate=false, float PlayRate=1.0f) const
 
bool HasClearStrikePath (const AMainPlayerCharacter *Player, const AActor *TargetActor) const
 
void SetAvatarPawnCollisionResponse (ECollisionResponse Response) const
 
float GetPlayerCurrentWeaponAttackRange () const
 
void SetAvatarMeshHidden (bool bHidden) const
 
void ResetSkillMontagePlayRate () const
 
AActor * GetTargetActor () const
 
UAnimMontage * GetSkillMontage (FGameplayTag PlayMontageTag=FGameplayTag::EmptyTag) const
 
bool ContainsAllMontageSections (const UAnimMontage *Montage, TArray< FName > SectionNames) const
 
template<typename T >
const T * GetExtendedData () const
 
template<typename T >
bool HasExtendedData () const
 
- UGA_CombatBase(으)로부터 상속된 Protected 멤버 함수
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 ()
 

Private 속성

float PullRadius = 0.0f
 
float PullStrength = 0.0f
 
float PullZComponent = 0.0f
 
float PullDuration = 1.0f
 
float PullInterval = 0.0f
 
TEnumAsByte< ECollisionChannel > OverlapChannel = ECC_Pawn
 
TArray< TSubclassOf< UGameplayEffect > > AreaEffects
 
TObjectPtr< class UAbilityTask_WaitDelay > WaitDurationTask = nullptr
 
FVector CachedWeaponLocation = FVector::ZeroVector
 
FTimerHandle PullTickTimer
 

추가로 상속된 멤버들

- UGA_SkillBase(으)로부터 상속된 Protected 속성
FGameplayTag CooldownTag
 
float CostValue
 
float CooldownDuration
 
- UGA_CombatBase(으)로부터 상속된 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
 

상세한 설명

무기 투사체 충돌 시점에 플레이어 ASC를 통해 발화되는 단발성 끌어당김 GA.

  • 트리거 방식: AbilityTriggers에 (Tag = TAG_..., TriggerSource = GameplayEvent) 등록. 호출 측(WeaponProjectile)은 OnCollided에서 PlayerASC->HandleGameplayEvent(Tag, EventData)를 호출.
  • 위치 해석 우선순위: TriggerEventData.Target(무기 액터) → TargetData.HitResult.ImpactPoint
  • 적용 대상: 검색 반경 내 살아있는 ACK_CharacterEnemy
  • 효과: (적 → 무기) 방향으로 LaunchCharacter, 선택적 광역 GE 적용

멤버 함수 문서화

◆ ActivateAbility()

void UGA_Skill_StarField::ActivateAbility ( const FGameplayAbilitySpecHandle  Handle,
const FGameplayAbilityActorInfo *  ActorInfo,
const FGameplayAbilityActivationInfo  ActivationInfo,
const FGameplayEventData *  TriggerEventData 
)
overridevirtual

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

46{
47 FVector WeaponLocation;
48
49 // TriggerEventData가 nullptr이면 일반 Activate 경로로 호출된 것 — 이 GA는 GameplayEvent 트리거 전용이라 비정상.
50 if (ResolveWeaponLocation(TriggerEventData, WeaponLocation) == false)
51 {
52 LOG_ERROR(LogCK, "WeaponPull: 무기 위치 해석 실패. EventData.Target 또는 TargetData.HitResult가 비어있음.");
53 EndAbility(Handle, ActorInfo, ActivationInfo, true, true);
54 return;
55 }
56
57 CachedWeaponLocation = WeaponLocation;
58 AActor* Avatar = ActorInfo ? ActorInfo->AvatarActor.Get() : nullptr;
59
60 // 시작 펄스 + 광역 GE는 1회만 — 펄스마다 재적용 시 슬로우/도트 중첩이 누적되어 의도와 어긋남.
62
63 // 지속 시간이 없거나 비정상이면 과거처럼 1회 펄스 후 즉시 종료 — 기존 동작 호환.
64 if (PullDuration < 0.f)
65 {
66 EndAbility(Handle, ActorInfo, ActivationInfo, true, false);
67 return;
68 }
69
70 // 펄스 반복: PullInterval > 0일 때만 — 0이면 시작 시 1회 펄스만 두고 N초 동안 활성 유지.
71 if (PullInterval > 0.f)
72 {
73 GetWorld()->GetTimerManager().SetTimer(PullTickTimer, this, &ThisClass::OnPullTick, PullInterval, true);
74 }
75
76 // 종료 시점은 AbilityTask가 담당 — WaitDelay 완료 시 EndAbility.
77 WaitDurationTask = UAbilityTask_WaitDelay::WaitDelay(this, PullDuration);
78
79 if (WaitDurationTask == nullptr)
80 {
81 // 태스크 생성 실패는 외부 의존성 문제 — 자원 정리 후 종료.
83 EndAbility(Handle, ActorInfo, ActivationInfo, true, true);
84 return;
85 }
86
87 WaitDurationTask->OnFinish.AddDynamic(this, &ThisClass::OnPullDurationFinished);
88 WaitDurationTask->ReadyForActivation();
89}
#define LOG_ERROR(Category, Format,...)
Definition CK_UE.h:40
TObjectPtr< class UAbilityTask_WaitDelay > WaitDurationTask
Definition GA_Skill_StarField.h:72
FTimerHandle PullTickTimer
Definition GA_Skill_StarField.h:76
float PullDuration
Definition GA_Skill_StarField.h:58
bool ResolveWeaponLocation(const FGameplayEventData *TriggerEventData, FVector &OutLocation) const
Definition GA_Skill_StarField.cpp:138
void ClearPullState()
Definition GA_Skill_StarField.cpp:122
virtual void EndAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo *ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility, bool bWasCancelled) override
Definition GA_Skill_StarField.cpp:92
void PerformPullAtLocation(const FVector &WeaponLocation, AActor *Avatar, bool bApplyAreaEffects)
Definition GA_Skill_StarField.cpp:171
FVector CachedWeaponLocation
Definition GA_Skill_StarField.h:75
float PullInterval
Definition GA_Skill_StarField.h:61
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ ApplyCombatData()

void UGA_Skill_StarField::ApplyCombatData ( )
overrideprotectedvirtual

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

20{
21 Super::ApplyCombatData();
22
23 if (CombatData == nullptr)
24 {
25 return;
26 }
27
28 if (const FSkillStarFieldData* Payload = CombatData->FindExtendedData<FSkillStarFieldData>())
29 {
30 PullRadius = Payload->PullRadius;
31 PullStrength = Payload->PullStrength;
32 PullZComponent = Payload->PullZComponent;
33 OverlapChannel = Payload->OverlapChannel;
34 AreaEffects = Payload->AreaEffects;
35 PullDuration = Payload->PullDuration;
36 PullInterval = Payload->PullInterval;
37 }
38 else
39 {
40 LOG_ERROR(LogCK, "%s가 유효하지 않습니다. ", NAMEOF(FSkillStarFieldData));
41 }
42}
#define NAMEOF(Type)
Definition CK_UE.h:30
TObjectPtr< UCombatDataBase > CombatData
Definition GA_CombatBase.h:75
float PullZComponent
Definition GA_Skill_StarField.h:55
float PullStrength
Definition GA_Skill_StarField.h:52
float PullRadius
Definition GA_Skill_StarField.h:49
TArray< TSubclassOf< UGameplayEffect > > AreaEffects
Definition GA_Skill_StarField.h:68
TEnumAsByte< ECollisionChannel > OverlapChannel
Definition GA_Skill_StarField.h:65
Definition ExtendedDatas.h:308

◆ ClearPullState()

void UGA_Skill_StarField::ClearPullState ( )
protected
123{
124 if (UWorld* World = GetWorld())
125 {
126 World->GetTimerManager().ClearTimer(PullTickTimer);
127 }
128
130 {
131 WaitDurationTask->OnFinish.RemoveDynamic(this, &ThisClass::OnPullDurationFinished);
132 WaitDurationTask->EndTask();
133 WaitDurationTask = nullptr;
134 }
135}
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ EndAbility()

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

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

93{
95
96 // 종료 알림: WeaponRequest 등 후속 GA가 WaitGameplayEvent로 동기화하는 핸드오프 지점.
97 // 캔슬/정상 종료 어떤 경로에서도 발화 — 대기 측이 무한 대기에 빠지지 않도록.
98 if (UAbilitySystemComponent* ASC = GetAbilitySystemComponentFromActorInfo())
99 {
100 FGameplayEventData FinishedData;
101 FinishedData.EventTag = TAG_CHARACTER_STATE_COMBAT_SKILL_PULLENEMIES_FINISHED;
102 FinishedData.Instigator = ActorInfo ? ActorInfo->AvatarActor.Get() : nullptr;
103 ASC->HandleGameplayEvent(TAG_CHARACTER_STATE_COMBAT_SKILL_PULLENEMIES_FINISHED, &FinishedData);
104 }
105
106 Super::EndAbility(Handle, ActorInfo, ActivationInfo, bReplicateEndAbility, bWasCancelled);
107}
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnPullDurationFinished()

void UGA_Skill_StarField::OnPullDurationFinished ( )
protected
117{
118 EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, true, false);
119}
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ OnPullTick()

void UGA_Skill_StarField::OnPullTick ( )
protected
111{
112 PerformPullAtLocation(CachedWeaponLocation, GetAvatarActorFromActorInfo(), false);
113}
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ PerformPullAtLocation()

void UGA_Skill_StarField::PerformPullAtLocation ( const FVector &  WeaponLocation,
AActor *  Avatar,
bool  bApplyAreaEffects 
)
protected
172{
173 UWorld* World = GetWorld();
174
175 if (World == nullptr)
176 {
177 return;
178 }
179
180 // 구형 영역 검색 — 무기 위치를 중심으로 PullRadius 만큼.
181 TArray<FOverlapResult> Overlaps;
182 FCollisionQueryParams QueryParams(SCENE_QUERY_STAT(WeaponPull), false);
183
184 if (Avatar != nullptr)
185 {
186 // 시전자(플레이어)는 검색 결과에서 제외 — 자기 자신에게 끌어당김이 적용되는 것 방지.
187 QueryParams.AddIgnoredActor(Avatar);
188 }
189
190 World->OverlapMultiByChannel(Overlaps, WeaponLocation, FQuat::Identity, OverlapChannel, FCollisionShape::MakeSphere(PullRadius), QueryParams);
191
192 if (Overlaps.IsEmpty())
193 {
194 return;
195 }
196
197 // 적 필터링 + 끌어당김 적용을 한 루프에서 수행. 같은 액터가 여러 컴포넌트로 잡혀도 AddUnique로 중복 차단.
198 TArray<AEnemyCharacterBase*> ValidEnemies;
199
200 for (const FOverlapResult& Overlap : Overlaps)
201 {
202 AActor* HitActor = Overlap.GetActor();
203
204 if (HitActor == nullptr)
205 {
206 continue;
207 }
208
209 AEnemyCharacterBase* Enemy = Cast<AEnemyCharacterBase>(HitActor);
210
211 if (Enemy == nullptr)
212 {
213 continue;
214 }
215
216 if (Enemy->IsDead() == true)
217 {
218 continue;
219 }
220
221 // 같은 적을 두 번 처리하지 않도록 — LaunchCharacter 중복 호출 시 가속이 누적되어 과도한 끌림 발생.
222 if (ValidEnemies.AddUnique(Enemy) == INDEX_NONE)
223 {
224 continue;
225 }
226
227 // 끌어당김 방향: (적 → 무기). Z는 직접 덮어써서 일정한 띄움 효과 부여.
228 const FVector EnemyLocation = Enemy->GetActorLocation();
229 FVector PullDir = (WeaponLocation - EnemyLocation).GetSafeNormal();
230
231 // 적이 무기와 거의 같은 위치(0거리)에 있는 엣지 케이스 — 방향이 영벡터가 되지 않도록 무방향 위로 띄움.
232 if (PullDir.IsNearlyZero())
233 {
234 PullDir = FVector::UpVector;
235 }
236 else
237 {
238 PullDir.Z = PullZComponent;
239 }
240
241 // bXYOverride/bZOverride = true → 기존 속도를 덮어써 매 충돌마다 일관된 끌어당김을 보장.
242 Enemy->LaunchCharacter(PullDir * PullStrength, true, true);
243 }
244
245 // 광역 GE는 옵션. 비어있으면 스킵 — 본 스킬의 직격 데미지는 무기 CollisionAbilityTag가 별도로 처리.
246 // bApplyAreaEffects=false인 경우(=펄스 반복 호출)는 GE 적용 단계 전체를 건너뜀 — 슬로우/도트 중첩 누적 방지.
247 if (bApplyAreaEffects == false || AreaEffects.IsEmpty() == true || ValidEnemies.IsEmpty() == true)
248 {
249 return;
250 }
251
252 UAbilitySystemComponent* SourceASC = GetAbilitySystemComponentFromActorInfo();
253
254 if (SourceASC == nullptr)
255 {
256 return;
257 }
258
259 for (const TSubclassOf<UGameplayEffect>& EffectClass : AreaEffects)
260 {
261 if (EffectClass == nullptr)
262 {
263 continue;
264 }
265
266 // 효과 컨텍스트는 매 GE마다 새로 — Instigator/SourceObject 정보가 GE별로 독립되도록.
267 FGameplayEffectContextHandle Context = SourceASC->MakeEffectContext();
268 Context.AddSourceObject(this);
269
270 FGameplayEffectSpecHandle SpecHandle = SourceASC->MakeOutgoingSpec(EffectClass, GetAbilityLevel(), Context);
271
272 if (SpecHandle.IsValid() == false)
273 {
274 continue;
275 }
276
277 for (AEnemyCharacterBase* Target : ValidEnemies)
278 {
279 // ApplyGameplayEffectSpecToTarget은 TargetData를 요구하므로, ASC 직접 호출이 더 단순.
280 SourceASC->ApplyGameplayEffectSpecToTarget(*SpecHandle.Data.Get(), Target->GetAbilitySystemComponent());
281 }
282 }
283}
virtual bool IsDead() const
Definition CharacterBase.cpp:65
Definition EnemyCharacterBase.h:49
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ResolveWeaponLocation()

bool UGA_Skill_StarField::ResolveWeaponLocation ( const FGameplayEventData *  TriggerEventData,
FVector &  OutLocation 
) const
protected
139{
140 if (TriggerEventData == nullptr)
141 {
142 return false;
143 }
144
145 if (const AActor* Target = TriggerEventData->Target)
146 {
147 OutLocation = Target->GetActorLocation();
148 return true;
149 }
150
151 // 우선순위 2: TargetData에 HitResult를 실어 보내는 경우 — 임팩트 지점 자체가 더 정확할 때 폴백 경로로 사용.
152 for (const TSharedPtr<FGameplayAbilityTargetData>& Data : TriggerEventData->TargetData.Data)
153 {
154 if (Data.IsValid() == false)
155 {
156 LOG_ERROR(LogCK, "%s 가 유효하지 않습니다. ", NAMEOF_VAR(Data));
157 continue;
158 }
159
160 if (const FHitResult* Hit = Data->GetHitResult())
161 {
162 OutLocation = Hit->ImpactPoint;
163 return true;
164 }
165 }
166
167 return false;
168}
#define NAMEOF_VAR(Expr)
Definition CK_UE.h:34
이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ AreaEffects

TArray<TSubclassOf<UGameplayEffect> > UGA_Skill_StarField::AreaEffects
private

◆ CachedWeaponLocation

FVector UGA_Skill_StarField::CachedWeaponLocation = FVector::ZeroVector
private

◆ OverlapChannel

TEnumAsByte<ECollisionChannel> UGA_Skill_StarField::OverlapChannel = ECC_Pawn
private

◆ PullDuration

float UGA_Skill_StarField::PullDuration = 1.0f
private

◆ PullInterval

float UGA_Skill_StarField::PullInterval = 0.0f
private

◆ PullRadius

float UGA_Skill_StarField::PullRadius = 0.0f
private

◆ PullStrength

float UGA_Skill_StarField::PullStrength = 0.0f
private

◆ PullTickTimer

FTimerHandle UGA_Skill_StarField::PullTickTimer
private

◆ PullZComponent

float UGA_Skill_StarField::PullZComponent = 0.0f
private

◆ WaitDurationTask

TObjectPtr<class UAbilityTask_WaitDelay> UGA_Skill_StarField::WaitDurationTask = nullptr
private

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