UE5多人MOBA+GAS 48、制作闪现技能

文章目录

  • 添加标签
  • 添加`GA_Blink`


添加标签

	CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Blink_Teleport)CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Blink_Cooldown)
	UE_DEFINE_GAMEPLAY_TAG_COMMENT(Ability_Blink_Teleport, "Ability.Blink.Teleport", "闪烁技能")UE_DEFINE_GAMEPLAY_TAG_COMMENT(Ability_Blink_Cooldown, "Ability.Blink.Cooldown", "闪烁技能冷却")

添加GA_Blink

在这里插入图片描述

#pragma once#include "CoreMinimal.h"
#include "GAS/Core/CGameplayAbility.h"
#include "GA_Blink.generated.h"/*** 闪烁技能:角色选择目标位置进行传送,落地时对周围敌人造成伤害和击退*/
UCLASS()
class CRUNCH_API UGA_Blink : public UCGameplayAbility
{GENERATED_BODY()
public:UGA_Blink();// 激活技能virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override;private:// 瞄准阶段动画(选择目标位置)UPROPERTY(EditDefaultsOnly, Category = "Anim")TObjectPtr<UAnimMontage> TargetingMontage;// 传送阶段动画UPROPERTY(EditDefaultsOnly, Category = "Anim")TObjectPtr<UAnimMontage> TeleportMontage;// 地面目标选择器类UPROPERTY(EditDefaultsOnly, Category = "Targeting")TSubclassOf<class ATargetActor_GroundPick> GroundPickTargetActorClass;// 落地伤害效果UPROPERTY(EditDefaultsOnly, Category = "Effect")FGenericDamageEffectDef DamageEffect;// 落地击退速度UPROPERTY(EditDefaultsOnly, Category = "Effect")float BlinkLandTargetPushSpeed = 5000.f;// 落地作用范围半径UPROPERTY(EditDefaultsOnly, Category = "Targeting")float TargetAreaRadius = 1000;// 最大闪烁距离UPROPERTY(EditDefaultsOnly, Category = "Targeting")float BlinkCastRange = 3000.f;// 目标选择完成回调UFUNCTION()void GroundPickTargetReceived(const FGameplayAbilityTargetDataHandle& TargetDataHandle);// 目标选择取消回调UFUNCTION()void GroundPickCancelled(const FGameplayAbilityTargetDataHandle& TargetDataHandle);// 传送事件回调(由动画事件触发)UFUNCTION()void Teleport(FGameplayEventData Payload);// 缓存的目标位置数据FGameplayAbilityTargetDataHandle BlinkTargetDataHandle;
};
#include "GA_Blink.h"#include "AbilitySystemBlueprintLibrary.h"
#include "Abilities/Tasks/AbilityTask_PlayMontageAndWait.h"
#include "Abilities/Tasks/AbilityTask_WaitGameplayEvent.h"
#include "Abilities/Tasks/AbilityTask_WaitTargetData.h"
#include "GAS/TA/TargetActor_GroundPick.h"
// #include "Abilities/Tasks/AbilityTask_ApplyRootMotionMoveToForce.h"UGA_Blink::UGA_Blink()
{ActivationOwnedTags.AddTag(TGameplayTags::Stats_Aim);
}void UGA_Blink::ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo,const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData)
{// 检查网络权限和预测键if (!HasAuthorityOrPredictionKey(ActorInfo, &ActivationInfo)){K2_EndAbility();return;}// 任务1:播放瞄准动画UAbilityTask_PlayMontageAndWait* PlayTargetingMontage = UAbilityTask_PlayMontageAndWait::CreatePlayMontageAndWaitProxy(this, NAME_None, TargetingMontage);PlayTargetingMontage->ReadyForActivation();// 任务2:创建目标选择器UAbilityTask_WaitTargetData* WaitBlinkLocationTargetData = UAbilityTask_WaitTargetData::WaitTargetData(this, NAME_None, EGameplayTargetingConfirmation::UserConfirmed, // 需要玩家确认GroundPickTargetActorClass);// 绑定目标选择完成和取消事件WaitBlinkLocationTargetData->ValidData.AddDynamic(this, &UGA_Blink::GroundPickTargetReceived);WaitBlinkLocationTargetData->Cancelled.AddDynamic(this, &UGA_Blink::GroundPickCancelled);WaitBlinkLocationTargetData->ReadyForActivation();// 生成目标选择器实例AGameplayAbilityTargetActor* TargetActor;WaitBlinkLocationTargetData->BeginSpawningActor(this, GroundPickTargetActorClass, TargetActor);ATargetActor_GroundPick* GroundPickTargetActor = Cast<ATargetActor_GroundPick>(TargetActor);if (GroundPickTargetActor){// 配置目标选择器参数GroundPickTargetActor->SetShouldDrawDebug(ShouldDrawDebug()); // 是否显示调试信息GroundPickTargetActor->SetTargetAreaRadius(TargetAreaRadius); // 作用半径GroundPickTargetActor->SetTargetTraceRange(BlinkCastRange);   // 最大距离}// 完成生成WaitBlinkLocationTargetData->FinishSpawningActor(this, TargetActor);
}void UGA_Blink::GroundPickTargetReceived(const FGameplayAbilityTargetDataHandle& TargetDataHandle)
{// 提交技能资源(如魔法值消耗)if (!K2_CommitAbility()){K2_EndAbility();return;}// 缓存目标位置数据(传送完成后造成伤害用)BlinkTargetDataHandle = TargetDataHandle;// 确保在服务端或预测有效时执行if (HasAuthorityOrPredictionKey(CurrentActorInfo, &CurrentActivationInfo)){// 任务3:播放传送动画UAbilityTask_PlayMontageAndWait* PlayTeleportMontage = UAbilityTask_PlayMontageAndWait::CreatePlayMontageAndWaitProxy(this, NAME_None, TeleportMontage);// 绑定动画结束事件到能力结束PlayTeleportMontage->OnBlendOut.AddDynamic(this, &UGA_Blink::K2_EndAbility);PlayTeleportMontage->OnCancelled.AddDynamic(this, &UGA_Blink::K2_EndAbility);PlayTeleportMontage->OnInterrupted.AddDynamic(this, &UGA_Blink::K2_EndAbility);PlayTeleportMontage->OnCompleted.AddDynamic(this, &UGA_Blink::K2_EndAbility);PlayTeleportMontage->ReadyForActivation();// 任务4:在服务端监听传送事件(动画通知触发)if (K2_HasAuthority()){UAbilityTask_WaitGameplayEvent* WaitTeleportTimePoint = UAbilityTask_WaitGameplayEvent::WaitGameplayEvent(this, TGameplayTags::Ability_Blink_Teleport);// 绑定传送事件回调WaitTeleportTimePoint->EventReceived.AddDynamic(this, &UGA_Blink::Teleport);WaitTeleportTimePoint->ReadyForActivation();}}
}void UGA_Blink::GroundPickCancelled(const FGameplayAbilityTargetDataHandle& TargetDataHandle)
{K2_EndAbility();
}void UGA_Blink::Teleport(FGameplayEventData Payload)
{if (K2_HasAuthority()){// 从目标数据获取选择的传送位置FHitResult PickedLocationHitResult = UAbilitySystemBlueprintLibrary::GetHitResultFromTargetData(BlinkTargetDataHandle, 1);FVector PickedTeleportLocation = PickedLocationHitResult.ImpactPoint;// 将角色传送到目标位置GetAvatarActorFromActorInfo()->SetActorLocation(PickedTeleportLocation);// 对落点范围内的目标应用伤害效果ApplyDamageToTargetDataHandle(BlinkTargetDataHandle, DamageEffect, GetAbilityLevel(CurrentSpecHandle, CurrentActorInfo));// 击退目标PushTargetsFromOwnerLocation(BlinkTargetDataHandle, BlinkLandTargetPushSpeed);}
}

位移的时候加一个动画通知
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
把技能添加到角色上
在这里插入图片描述
这样技能就齐全了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919148.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919148.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Swift 实战:实现一个简化版的 Twitter(LeetCode 355)

文章目录摘要描述示例解决答案设计思路题解代码分析测试示例和结果时间复杂度空间复杂度总结摘要 在社交媒体平台里&#xff0c;推送机制是核心功能之一。比如你关注了某人&#xff0c;就希望在自己的时间线上能看到他们的最新消息&#xff0c;同时自己的消息也要能出现在别人…

在浏览器端使用 xml2js 遇到的报错及解决方法

在浏览器端使用 xml2js 遇到的报错及解决方法 一、引言 在前端开发过程中&#xff0c;我们常常需要处理 XML 数据。xml2js 是一个非常流行的用于将 XML 转换为 JavaScript 对象的库。然而&#xff0c;当我们在浏览器端使用它时&#xff0c;可能会遇到一些问题。本文将介绍在浏览…

eChart饼环pie中间显示总数_2个以上0值不挤掉

<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>环饼图显示总数</title><script src"https://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js"></script><style>#main { widt…

Ansible 核心功能进阶:自动化任务的灵活控制与管理

一、管理 FACTS&#xff1a;获取远程主机的 “身份信息”FACTS 是 Ansible 自动收集的远程主机详细信息&#xff08;类似 “主机身份证”&#xff09;&#xff0c;包括主机名、IP、系统版本、硬件配置等。通过 FACTS 可以动态获取主机信息&#xff0c;让 Playbook 更灵活1. 查看…

gRPC网络模型详解

gRPC协议框架 TCP层&#xff1a;底层通信协议&#xff0c;基于TCP连接。 TLS层&#xff1a;该层是可选的&#xff0c;基于TLS加密通道。 HTTP2层&#xff1a;gRPC承载在HTTP2协议上&#xff0c;利用了HTTP2的双向流、流控、头部压缩、单连接上的多 路复用请求等特性。 gRPC层…

[优选算法专题二滑动窗口——将x减到0的最小操作数]

题目链接 将x减到0的最小操作数 题目描述 题目解析 问题重述 给定一个整数数组 nums 和一个整数 x&#xff0c;每次只能从数组的左端或右端移除一个元素&#xff0c;并将该元素的值从 x 中减去。我们需要找到将 x 恰好减为 0 的最少操作次数&#xff0c;如果不可能则返回 -…

AOP配置类自动注入

本文主要探究AopAutoConfiguration配置类里面的bean怎么被自动装配的。代码如下&#xff1a;package com.example.springdemo.demos.a05;import com.example.springdemo.demos.a04.Bean1; import com.example.springdemo.demos.a04.Bean2; import com.example.springdemo.demos…

云计算-K8s 实战:Pod、安全上下文、HPA 、CRD、网络策略、亲和性等功能配置实操指南

简介 此次围绕Kubernetes 日常管理中的核心场景,提供了从基础到进阶的实操配置指南。内容涵盖 9 大关键知识点:从使用 nginx 镜像创建 QoS 类为 Guaranteed 的 Pod,到为 Pod 配置安全上下文以指定运行用户和组;从自定义 Student 资源类型(CRD),到配置 Sidecar 实现跨命…

嵌入式LINUX——————TCP并发服务器

一、服务器1.服务器分类单循环服务器&#xff1a;只能处理一个客户端任务的服务器 并发服务器&#xff1a;可同时处理多个客户端任务的服务器二、TCP并发服务器的构建1.如何构建&#xff1f; &#xff08;1&#xff09;多进程&#xff08;每一次创建都非常耗时耗空间&#…

论文润色不能降低文章的重复率

最近大家问到多的&#xff0c;你们润色好了重复率会不会就降低了。这事儿啊&#xff0c;得从好几个方面去剖析&#xff0c;今天咱们就一块儿来探个究竟。咱们先得清楚&#xff0c;重复率检测工具一般会把内容标记成两类&#xff1a;一是那些和其他文献在文字表达上高度相似的部…

Python爬虫实战:构建alltheplaces平台地理信息数据采集系统

1. 引言 1.1 研究背景与意义 在大数据与智慧城市建设的推动下,地理位置信息(如餐馆、景点、公共设施等 POI 数据)已成为商业分析、城市规划、公共服务优化的核心基础数据。alltheplaces 作为全球领先的开放场所数据平台,整合了来自多个数据源的标准化信息,涵盖场所名称、…

HTML第三次作业

抽奖项目代码<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>简易抽奖转盘</title><sty…

PyTorch 面试题及详细答案120题(01-05)-- 基础概念与安装

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

云手机选哪个比较好用?

云手机作为基于云计算技术运行的一款虚拟手机&#xff0c;能够帮助企业与个人用户进行账号多开和远程访问等多种功能&#xff0c;是手游玩家的首要选择&#xff0c;能够多开账号挂机不卡顿&#xff0c;但是哪一款云手机更加流畅好用呢&#xff1f;对于热衷于手游的玩家来说&…

[科研理论]无人机底层控制算法PID、LQR、MPC解析

文章目录1. PX4飞控PID简介1.1 位置控制器1.2 速度控制器1.3 加速度和yaw转到姿态1.4 姿态控制器1.5 角速率控制器2. 线性二次型优化&#xff08;LQR&#xff09;控制3. 模型预测控制MPC/NMPC3.1 MPC3.2 NMPC1. PX4飞控PID简介 相关链接&#xff1a;PX4官方中文文档、PID概念(…

AI系统性思维复盘概述

核心价值&#xff1a;从“被动思考”到“主动进化”。 基于数据驱动、机器学习和知识图谱的智能化组织学习系统&#xff0c;它将经验积累从传统的主观性、碎片化模式转变为客观性、系统化的科学模式&#xff0c;最终实现从被动应对向主动预防、从经验决策向数据决策、从个体智慧…

C++继承(2)

2.基类和派生类间的转换 •public继承的派⽣类对象可以赋值给基类的指针/基类的引⽤。这⾥有个形象的说法叫切⽚或者切 割。寓意把派⽣类中基类那部分切出来&#xff0c;基类指针或引⽤指向的是派⽣类中切出来的基类那部分。 • 基类对象不能赋值给派⽣类对象。 • 基类的指针或…

easya2a: 一键将 LangChain Agent 发布为 A2A 服务

easya2a: 一键将 LangChain Agent 发布为 A2A 服务 随着 A2A (Agent-to-Agent) 协议的发布&#xff0c;相关的实践项目也逐渐涌现。对于许多希望体验 A2A 功能&#xff0c;但又担心学习成本和开发时间的开发者来说&#xff0c;推荐使用 easya2a——一个可以快速、无缝地将现有 …

原学之设计模式- 设计模式来源

引言 各位旅行者们你们好&#xff0c;我是小森&#xff0c;首先我为啥是程序员。学了技术快六年了&#xff0c;但一直都是断断续续&#xff0c;本身自己的条件&#xff0c;从2021年11月份开始下载原神&#xff0c;总而言之不了解一些抽卡机制导致退了并且删除了具体账号打算重新…

有鹿机器人:AI技术如何重新定义「扫地」这件小事?

当扫地成为一门“技术活”扫地&#xff0c;可能是人类最古老的清洁行为之一。从扫帚到吸尘器&#xff0c;再到今天的无人驾驶清洁设备&#xff0c;我们一直在寻找更高效、更彻底的方式维护环境整洁。但有鹿机器人的出现&#xff0c;让“扫地”这件事有了新的定义——它不再只是…