当前位置: 首页 > news >正文

UE5多人MOBA+GAS 46、制作龙卷风技能

文章目录

  • 创建龙卷风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

在这里插入图片描述
随便填写
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

添加数据表

在这里插入图片描述

添加到角色中

在这里插入图片描述

http://www.lryc.cn/news/622991.html

相关文章:

  • 机器学习——PCA算法
  • 心路历程-学Linux的开端
  • 【php反序列化介绍与常见触发方法】
  • Linux 多线程:线程回收策略 线程间通信(互斥锁详解)
  • MyBatis 的 SQL 拦截器:原理、实现与实践
  • 【昇腾】单张48G Atlas 300I Duo推理卡MindIE+WebUI方式跑7B大语言模型_20250816
  • Wi-Fi 7 将如何重塑互联工作场所
  • Python脚本开发-统计Rte中未连接的Port
  • Python---异常链(Exception Chaining)
  • 完整设计 之 定稿 之:后现代元宇宙九宫格(重命名)-腾讯元宝答问
  • 线性代数之两个宇宙文明关于距离的对话
  • 分享一个大数据的源码实现 基于Hadoop的二手车市场数据分析与可视化 基于Spark的懂车帝二手车交易数据可视化分析系统
  • Transformer浅说
  • MySQL完整重置密码流程(针对 macOS)
  • 如何使用嵌入模型创建本地知识库Demo
  • MongoDB 聚合提速 3 招:$lookup 管道、部分索引、时间序列集合(含可复现实验与 explain 统计)
  • Tomcat类加载器原理简单介绍
  • AI热点周报(8.10~8.16):AI界“冰火两重天“,GPT-5陷入热议,DeepSeek R2模型训练受阻?
  • 服务器可以ping通,但部署的网站打不开
  • uniapp:微信小程序使用Canvas 和Canvas 2D绘制图形
  • nginx下载地址:aarch64
  • Scala面试题及详细答案100道(11-20)-- 函数式编程基础
  • 狗品种识别数据集:1k+图像,6个类别,yolo标注完整
  • linux docker neo4j 导出 (windows 导入)
  • duiLib 实现鼠标拖动状态栏时,窗口跟着拖动
  • 模型量化(Model Quantization)
  • 解决 Windows 下运行 MCP 脚本弹出 WSH 错误窗口的问题 | Windows Script Host
  • 【数据分析】比较SparCC、Pearson和Spearman相关性估计方法在合成组学数据上的表现
  • Footej Camera 2:专业级摄影体验,尽在掌中
  • 《代码重生:杨蓉与62.webp》