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

#include <GA_KnockDown.h>

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

Public 멤버 함수

 UGA_KnockDown ()
 
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_Base(으)로부터 상속된 Public 멤버 함수
 UGA_Base ()
 

Private 멤버 함수

bool InitializeKnockdown (ACharacter *Character, const FGameplayEventData *TriggerEventData)
 
bool HasKnockDownMontage ()
 
bool HasMontageSections () const
 
bool SetupKnockdownMotionWarp (ACharacter *Character, const AActor *Instigator) const
 
void ClearKnockdownTasks ()
 
void OnLoopStarted (FGameplayEventData Payload)
 
void OnDownDurationFinished ()
 

Private 속성

TObjectPtr< UAnimMontage > KnockdownMontage
 
TObjectPtr< UAbilityTask_PlayMontageAndWait > MontageTask
 
TObjectPtr< UAbilityTask_WaitGameplayEvent > LoopEventTask
 
TObjectPtr< UAbilityTask_WaitDelay > DownDurationTask
 
TObjectPtr< UCharacterMovementComponentBase > RotationComponent
 
float AddDownDuration = 0.0f
 
float KnockDownDistance = 0.0f
 
bool bManualRotationActive = false
 

추가로 상속된 멤버들

- 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 ()
 

생성자 & 소멸자 문서화

◆ UGA_KnockDown()

UGA_KnockDown::UGA_KnockDown ( )
31{
32 ActivationBlockedTags.RemoveTag(TAG_CHARACTER_STATE_ISHITSTUN);
33 ActivationBlockedTags.AddTag(TAG_CHARACTER_STATE_ISDEAD);
34
35 ActivationOwnedTags.AddTag(TAG_CHARACTER_STATE_ISKNOCKEDDOWN);
36 ActivationOwnedTags.AddTag(TAG_CHARACTER_STATE_ISBLOCKMOVEMENT);
37 ActivationOwnedTags.AddTag(TAG_CHARACTER_STATE_ISINVINCIBLE);
38
39 FAbilityTriggerData TriggerData;
40 TriggerData.TriggerTag = TAG_EVENT_PLAYER_KNOCKDOWN;
41 TriggerData.TriggerSource = EGameplayAbilityTriggerSource::GameplayEvent;
42 AbilityTriggers.Add(TriggerData);
43}

멤버 함수 문서화

◆ ActivateAbility()

void UGA_KnockDown::ActivateAbility ( const FGameplayAbilitySpecHandle  Handle,
const FGameplayAbilityActorInfo *  ActorInfo,
const FGameplayAbilityActivationInfo  ActivationInfo,
const FGameplayEventData *  TriggerEventData 
)
overridevirtual
47{
48 Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);
49
50 ACharacter* Character = Cast<ACharacter>(GetAvatarActorFromActorInfo());
51 if (IsValid(Character) == false || InitializeKnockdown(Character, TriggerEventData) == false)
52 {
53 EndAbility(Handle, ActorInfo, ActivationInfo, true, true);
54 return;
55 }
56
57 UAbilitySystemComponent* ASC = GetAbilitySystemComponentFromActorInfo();
58 if (IsValid(ASC) == false)
59 {
60 EndAbility(Handle, ActorInfo, ActivationInfo, true, true);
61 return;
62 }
63
64 ASC->CancelAllAbilities(this);
65
66 FGameplayTagContainer HitStunTags;
67 HitStunTags.AddTag(TAG_CHARACTER_STATE_ISHITSTUN);
68 ASC->RemoveActiveEffectsWithGrantedTags(HitStunTags);
69
70 if (UCharacterMovementComponent* MovementComponent = Character->GetCharacterMovement())
71 {
72 MovementComponent->StopMovementImmediately();
73 }
74
75 LoopEventTask = UAbilityTask_WaitGameplayEvent::WaitGameplayEvent(this, TAG_EVENT_PLAYER_KNOCKDOWN_LOOPSTART, nullptr, true, true);
76 if (IsValid(LoopEventTask))
77 {
78 LoopEventTask->EventReceived.AddDynamic(this, &ThisClass::OnLoopStarted);
79 LoopEventTask->ReadyForActivation();
80 }
81
82 MontageTask = UAbilityTask_PlayMontageAndWait::CreatePlayMontageAndWaitProxy(this, TEXT("PlayerKnockdown"), KnockdownMontage);
83 if (IsValid(MontageTask) == false)
84 {
85 EndAbility(Handle, ActorInfo, ActivationInfo, true, true);
86 return;
87 }
88
89 MontageTask->OnCompleted.AddDynamic(this, &ThisClass::OnAbilityMontageCompleted);
90 MontageTask->OnInterrupted.AddDynamic(this, &ThisClass::OnAbilityMontageInterrupted);
91 MontageTask->OnCancelled.AddDynamic(this, &ThisClass::OnAbilityMontageInterrupted);
92 MontageTask->ReadyForActivation();
93}
bool InitializeKnockdown(ACharacter *Character, const FGameplayEventData *TriggerEventData)
Definition GA_KnockDown.cpp:125
virtual void EndAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo *ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility, bool bWasCancelled) override
Definition GA_KnockDown.cpp:96
TObjectPtr< UAbilityTask_WaitGameplayEvent > LoopEventTask
Definition GA_KnockDown.h:49
TObjectPtr< UAnimMontage > KnockdownMontage
Definition GA_KnockDown.h:43
TObjectPtr< UAbilityTask_PlayMontageAndWait > MontageTask
Definition GA_KnockDown.h:46
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ ClearKnockdownTasks()

void UGA_KnockDown::ClearKnockdownTasks ( )
private
254{
255 if (IsValid(LoopEventTask))
256 {
257 LoopEventTask->EventReceived.RemoveDynamic(this, &ThisClass::OnLoopStarted);
258 LoopEventTask->EndTask();
259 }
260
261 if (IsValid(DownDurationTask))
262 {
263 DownDurationTask->OnFinish.RemoveDynamic(this, &ThisClass::OnDownDurationFinished);
264 DownDurationTask->EndTask();
265 }
266
267 LoopEventTask = nullptr;
268 DownDurationTask = nullptr;
269 MontageTask = nullptr;
270}
TObjectPtr< UAbilityTask_WaitDelay > DownDurationTask
Definition GA_KnockDown.h:52
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ EndAbility()

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

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

97{
98 if (IsEndAbilityValid(Handle, ActorInfo) == false)
99 {
100 return;
101 }
102
104
105 if (UCharacterMotionWarpingComponentBase* MotionWarpingComponent = GetMotionWarpingComponent())
106 {
107 MotionWarpingComponent->StopMotionWarp(WarpTargetName);
108 }
109
111 {
112 RotationComponent->EndManualRotation();
113 }
114
115 bManualRotationActive = false;
116 RotationComponent = nullptr;
117 KnockdownMontage = nullptr;
118 AddDownDuration = 0.0f;
119 KnockDownDistance = 0.0f;
120
121 Super::EndAbility(Handle, ActorInfo, ActivationInfo, bReplicateEndAbility, bWasCancelled);
122}
static const FName WarpTargetName(TEXT("KnockDown"))
UCharacterMotionWarpingComponentBase * GetMotionWarpingComponent() const
Definition GA_Base.cpp:33
bool bManualRotationActive
Definition GA_KnockDown.h:59
TObjectPtr< UCharacterMovementComponentBase > RotationComponent
Definition GA_KnockDown.h:55
void ClearKnockdownTasks()
Definition GA_KnockDown.cpp:253
float KnockDownDistance
Definition GA_KnockDown.h:58
float AddDownDuration
Definition GA_KnockDown.h:57
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ HasKnockDownMontage()

bool UGA_KnockDown::HasKnockDownMontage ( )
private
152{
153 const AMainPlayerCharacter* Player = Cast<AMainPlayerCharacter>(GetAvatarActorFromActorInfo());
154 if (IsValid(Player) == false)
155 {
156 return false;
157 }
158
159 const UWeaponLoadoutComponent* LoadoutComponent = Player->GetWeaponLoadoutComponent();
160 const UWeaponDefinition* WeaponDefinition = IsValid(LoadoutComponent) ? LoadoutComponent->GetCurrentDefinition() : nullptr;
161 if (IsValid(WeaponDefinition) == false)
162 {
163 LOG_ERROR(LogCKAbility, "강 경직에 사용할 현재 무기 Definition이 없습니다.");
164 return false;
165 }
166
168 KnockDownDistance = FMath::Max(WeaponDefinition->KnockdownData.KnockDownDistance, 0.0f);
169 AddDownDuration = FMath::Max(WeaponDefinition->KnockdownData.KnockDownDuration, 0.0f);
170
171 if (IsValid(KnockdownMontage) == false)
172 {
173 LOG_ERROR(LogCKAbility, "현재 무기에 강 경직 몽타주가 설정되지 않았습니다.");
174 return false;
175 }
176
177 return true;
178}
#define LOG_ERROR(Category, Format,...)
Definition CK_UE.h:40
Definition MainPlayerCharacter.h:39
Definition WeaponDefinition.h:77
FWeaponKnockdownData KnockdownData
Definition WeaponDefinition.h:115
float KnockDownDistance
Definition WeaponDefinition.h:72
float KnockDownDuration
Definition WeaponDefinition.h:69
TObjectPtr< UAnimMontage > KnockDownMontage
Definition WeaponDefinition.h:66
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ HasMontageSections()

bool UGA_KnockDown::HasMontageSections ( ) const
private
182{
183 if (IsValid(KnockdownMontage) == false)
184 {
185 return false;
186 }
187
188 const bool bHasSections = KnockdownMontage->IsValidSectionName(LoopSectionName) && KnockdownMontage->IsValidSectionName(RecoverSectionName);
189 if (bHasSections == false)
190 {
191 LOG_ERROR(LogCKAbility, "강 경직 몽타주에 Loop, Recover 섹션 모두 필요.");
192 }
193
194 return bHasSections;
195}
static const FName RecoverSectionName(TEXT("Recover"))
static const FName LoopSectionName(TEXT("Loop"))
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ InitializeKnockdown()

bool UGA_KnockDown::InitializeKnockdown ( ACharacter *  Character,
const FGameplayEventData *  TriggerEventData 
)
private
126{
127 if (HasKnockDownMontage() == false || HasMontageSections() == false)
128 {
129 return false;
130 }
131
132 RotationComponent = Cast<UCharacterMovementComponentBase>(Character->GetCharacterMovement());
133
134 if (IsValid(RotationComponent))
135 {
136 RotationComponent->BeginManualRotation();
138 }
139
140 const AActor* Instigator = TriggerEventData ? TriggerEventData->Instigator.Get() : nullptr;
141
142 if (IsValid(Instigator) && Instigator != Character && IsValid(RotationComponent))
143 {
144 RotationComponent->RotateToLocation(Instigator->GetActorLocation(), 0.0f, 0.0f, 0.0f, false);
145 }
146
147 return SetupKnockdownMotionWarp(Character, Instigator);
148}
bool SetupKnockdownMotionWarp(ACharacter *Character, const AActor *Instigator) const
Definition GA_KnockDown.cpp:198
bool HasMontageSections() const
Definition GA_KnockDown.cpp:181
bool HasKnockDownMontage()
Definition GA_KnockDown.cpp:151
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnDownDurationFinished()

void UGA_KnockDown::OnDownDurationFinished ( )
private
293{
294 DownDurationTask = nullptr;
295
296 ACharacter* Character = Cast<ACharacter>(GetAvatarActorFromActorInfo());
297 UAnimInstance* AnimInstance = Character->GetMesh()->GetAnimInstance();
298 if (IsValid(AnimInstance) == false || IsValid(KnockdownMontage) == false)
299 {
300 EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, true, true);
301 return;
302 }
303
304 AnimInstance->Montage_JumpToSection(RecoverSectionName, KnockdownMontage);
305}
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ OnLoopStarted()

void UGA_KnockDown::OnLoopStarted ( FGameplayEventData  Payload)
private
274{
275 if (IsValid(DownDurationTask))
276 {
277 return;
278 }
279
280 DownDurationTask = UAbilityTask_WaitDelay::WaitDelay(this, AddDownDuration);
281 if (IsValid(DownDurationTask) == false)
282 {
284 return;
285 }
286
287 DownDurationTask->OnFinish.AddDynamic(this, &ThisClass::OnDownDurationFinished);
288 DownDurationTask->ReadyForActivation();
289}
void OnDownDurationFinished()
Definition GA_KnockDown.cpp:292
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ SetupKnockdownMotionWarp()

bool UGA_KnockDown::SetupKnockdownMotionWarp ( ACharacter *  Character,
const AActor *  Instigator 
) const
private
199{
200 if (IsValid(Character) == false)
201 {
202 return false;
203 }
204
205 UCharacterMotionWarpingComponentBase* MotionWarpingComponent = GetMotionWarpingComponent();
206 UCapsuleComponent* CapsuleComponent = Character->GetCapsuleComponent();
207 UWorld* World = Character->GetWorld();
208 if (IsValid(MotionWarpingComponent) == false || IsValid(CapsuleComponent) == false || IsValid(World) == false)
209 {
210 return false;
211 }
212
213 FVector FacingDirection = IsValid(Instigator) ? Instigator->GetActorLocation() - Character->GetActorLocation() : Character->GetActorForwardVector();
214 FacingDirection.Z = 0.0f;
215
216 if (FacingDirection.Normalize() == false)
217 {
218 FacingDirection = Character->GetActorForwardVector();
219 FacingDirection.Z = 0.0f;
220 FacingDirection.Normalize();
221 }
222
223 const FVector KnockdownDirection = -FacingDirection;
224 const FVector SweepStart = CapsuleComponent->GetComponentLocation();
225 const FVector SweepEnd = SweepStart + KnockdownDirection * KnockDownDistance;
226
227 // 캡슐 크기 감소(바닥 감지 우려)
228 constexpr float CapsuleDecreaseValue = 2.0f;
229 const float CapsuleRadius = FMath::Max(CapsuleComponent->GetScaledCapsuleRadius() - CapsuleDecreaseValue , 1.0f);
230 const float CapsuleHalfHeight = FMath::Max(CapsuleComponent->GetScaledCapsuleHalfHeight() - CapsuleDecreaseValue , CapsuleRadius);
231 const FCollisionShape SweepShape = FCollisionShape::MakeCapsule(CapsuleRadius, CapsuleHalfHeight);
232
233 // 충돌 감지 타입
234 FCollisionObjectQueryParams ObjectQueryParams;
235 ObjectQueryParams.AddObjectTypesToQuery(ECC_WorldStatic);
236 ObjectQueryParams.AddObjectTypesToQuery(ECC_WorldDynamic);
237
238 FCollisionQueryParams QueryParams(SCENE_QUERY_STAT(PlayerKnockdownMotionWarp), false, Character);
239 FHitResult HitResult;
240 const bool bBlockingHit = World->SweepSingleByObjectType(HitResult, SweepStart, SweepEnd,FQuat::Identity, ObjectQueryParams, SweepShape, QueryParams);
241
242 // 해당 충돌 위치보다 Tolerance만큼 앞에 위치
243 constexpr float WallTolerance = 10.0f;
244 const float AvailableDistance = bBlockingHit ? FMath::Max(HitResult.Distance - WallTolerance, 0.0f) : KnockDownDistance;
245 const FVector WarpTargetLocation = Character->GetActorLocation() + KnockdownDirection * AvailableDistance;
246
247 MotionWarpingComponent->UpdateMotionWarpTarget(WarpTargetName, WarpTargetLocation, FacingDirection.Rotation());
248
249 return true;
250}
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ AddDownDuration

float UGA_KnockDown::AddDownDuration = 0.0f
private

◆ bManualRotationActive

bool UGA_KnockDown::bManualRotationActive = false
private

◆ DownDurationTask

TObjectPtr<UAbilityTask_WaitDelay> UGA_KnockDown::DownDurationTask
private

◆ KnockDownDistance

float UGA_KnockDown::KnockDownDistance = 0.0f
private

◆ KnockdownMontage

TObjectPtr<UAnimMontage> UGA_KnockDown::KnockdownMontage
private

◆ LoopEventTask

TObjectPtr<UAbilityTask_WaitGameplayEvent> UGA_KnockDown::LoopEventTask
private

◆ MontageTask

TObjectPtr<UAbilityTask_PlayMontageAndWait> UGA_KnockDown::MontageTask
private

◆ RotationComponent

TObjectPtr<UCharacterMovementComponentBase> UGA_KnockDown::RotationComponent
private

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