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

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.dtcms.com/a/335888.html

相关文章:

  • 第三十九天(WebPack构建打包Mode映射DevTool源码泄漏识别还原)
  • 软件开发 - foreground 与 background
  • 电容,三极管,场效应管
  • 光耦,发声器件,继电器,瞬态抑制二极管
  • 【102页PPT】新一代数字化转型信息化总体规划方案(附下载方式)
  • Coin与Token的区别解析
  • Python爬虫-解决爬取政务网站的附件,找不到附件链接的问题
  • 数学建模-评价类问题-优劣解距离法(TOPSIS)
  • 博士招生 | 新加坡国立大学 SWEET实验室 招收人机交互方向 博士/博士后
  • 13.web api 4
  • 实现用户输入打断大模型流式输出:基于Vue与FastAPI的方案
  • 基于DSP+ARM+FPGA架构的储能协调控制器解决方案,支持全国产化
  • Diamond基础2:开发流程之LedDemo
  • JavaScirpt高级程序设计第三版学习查漏补缺(1)
  • vba学习系列(12)--反射率通过率计算复杂度优化25/8/17
  • Nacos 注册中心学习笔记
  • Yolov模型的演变
  • 计算机毕业设计java的小天鹅酒店月子会所管理小天鹅酒店母婴护理中心管理系统设计小天鹅酒店产后护理会所信息化管理平台
  • ansible管理变量和事实
  • RAG学习(一)
  • 在职老D渗透日记day19:sqli-labs靶场通关(第26a关)get布尔盲注 过滤or和and基础上又过滤了空格和注释符 ‘)闭合
  • Google Earth Engine | (GEE)逐月下载的MODIS叶面积指数LAI
  • 好看的个人导航系统多模板带后台
  • 二叉搜索树的模拟实现
  • 【MySQL学习|黑马笔记|Day7】触发器和锁(全局锁、表级锁、行级锁、)
  • Golang 后台技术面试套题 1
  • 天地图应用篇:增加全屏、图层选择功能
  • 2023年全国研究生数学建模竞赛华为杯E题出血性脑卒中临床智能诊疗建模求解全过程文档及程序
  • multiboot 规范实践分析
  • STM32—OTA-YModem