文章目錄
- 創建龍卷風GA
- 創建蒙太奇
- 創捷一系列GE
- 添加數據表
- 添加到角色中
創建龍卷風GA
GA_Tornado
添加標簽
// 龍卷風冷卻CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Tornado_Cooldown)// 通用技能傷害CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Generic_Damage)// 通用目標觸發CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Generic_Target)
UE_DEFINE_GAMEPLAY_TAG_COMMENT(Ability_Tornado_Cooldown, "Ability.Tornado.Cooldown", "龍卷風技能冷卻")UE_DEFINE_GAMEPLAY_TAG_COMMENT(Ability_Generic_Damage, "Ability.Generic.Damage", "技能傷害")UE_DEFINE_GAMEPLAY_TAG_COMMENT(Ability_Generic_Target, "Ability.Generic.Target", "技能目標")
#pragma once#include "CoreMinimal.h"
#include "GAS/Core/CGameplayAbility.h"
#include "GA_Tornado.generated.h"/*** 龍卷風技能:角色召喚龍卷風,持續對周圍敵人造成傷害和擊退效果*/
UCLASS()
class UGA_Tornado : public UCGameplayAbility
{GENERATED_BODY()
public: // 激活技能virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override; private:// 命中時應用的傷害效果UPROPERTY(EditDefaultsOnly, Category = "Effect")FGenericDamageEffectDef HitDamageEffect;// 命中時的擊退速度UPROPERTY(EditDefaultsOnly, Category = "Effect")float HitPushSpeed = 3000.f;// 龍卷風技能動畫UPROPERTY(EditDefaultsOnly, Category = "Anim")TObjectPtr<UAnimMontage> TornadoMontage;// 龍卷風持續時長(秒)UPROPERTY(EditDefaultsOnly, Category = "Effect")float TornadoDuration = 4.f;// 傷害事件回調(當動畫事件觸發時調用)UFUNCTION()void TornadoDamageEventReceived(FGameplayEventData Payload);
};
#include "GA_Tornado.h"#include "Abilities/Tasks/AbilityTask_PlayMontageAndWait.h"
#include "Abilities/Tasks/AbilityTask_WaitCancel.h"
#include "Abilities/Tasks/AbilityTask_WaitGameplayEvent.h"
#include "Abilities/Tasks/AbilityTask_WaitDelay.h"void UGA_Tornado::ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo,const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData)
{// 提交技能資源(如冷卻、消耗等),失敗則結束if (!K2_CommitAbility()){K2_EndAbility();return;}if (HasAuthorityOrPredictionKey(ActorInfo, &ActivationInfo)){// 任務1:播放龍卷風動畫UAbilityTask_PlayMontageAndWait* PlayTornadoMontage = UAbilityTask_PlayMontageAndWait::CreatePlayMontageAndWaitProxy(this, NAME_None, TornadoMontage);// 綁定動畫結束/中斷事件PlayTornadoMontage->OnBlendOut.AddDynamic(this, &UGA_Tornado::K2_EndAbility);PlayTornadoMontage->OnCancelled.AddDynamic(this, &UGA_Tornado::K2_EndAbility);PlayTornadoMontage->OnInterrupted.AddDynamic(this, &UGA_Tornado::K2_EndAbility);PlayTornadoMontage->OnCompleted.AddDynamic(this, &UGA_Tornado::K2_EndAbility);PlayTornadoMontage->ReadyForActivation(); // 啟動任務// 任務2:在服務端監聽傷害事件if (K2_HasAuthority()){// 等待監聽傷害事件UAbilityTask_WaitGameplayEvent* WaitDamageEvent = UAbilityTask_WaitGameplayEvent::WaitGameplayEvent(this, TGameplayTags::Ability_Generic_Damage,nullptr, false);// 綁定事件回調WaitDamageEvent->EventReceived.AddDynamic(this, &UGA_Tornado::TornadoDamageEventReceived);WaitDamageEvent->ReadyForActivation();}// 任務3:等待技能取消(如玩家提前中斷)UAbilityTask_WaitCancel* WaitCancel = UAbilityTask_WaitCancel::WaitCancel(this);WaitCancel->OnCancel.AddDynamic(this, &UGA_Tornado::K2_EndAbility);WaitCancel->ReadyForActivation();// 任務4:設置技能超時(基于持續時間)UAbilityTask_WaitDelay* WaitTornadoTimeout = UAbilityTask_WaitDelay::WaitDelay(this, TornadoDuration);WaitTornadoTimeout->OnFinish.AddDynamic(this, &UGA_Tornado::K2_EndAbility);WaitTornadoTimeout->ReadyForActivation();}
}void UGA_Tornado::TornadoDamageEventReceived(FGameplayEventData Payload)
{// 服務器中執行if (K2_HasAuthority()){// 獲取目標數據FGameplayAbilityTargetDataHandle TargetDataHandle = Payload.TargetData;// 應用傷害ApplyDamageToTargetDataHandle(TargetDataHandle, HitDamageEffect, GetAbilityLevel(CurrentSpecHandle, CurrentActorInfo));// 擊退目標PushTargetsFromOwnerLocation(TargetDataHandle, HitPushSpeed);}
}
創建蒙太奇
添加兩個插槽
創捷一系列GE
隨便填寫