UE5 GAS开发P41-43 永久效果,去除永久效果,伤害区域,EnumClass,开始重叠与结束重叠事件

news2024/12/23 4:22:31

这一部分学习了怎么创建一个伤害性的地形(火焰地形,毒沼泽等都可以用这个方式创建)

AuraEffectActor.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameplayEffect.h"
#include "AbilitySystem/AuraAbilitySystemComponentBase.h"
#include "Components/SphereComponent.h"
#include "GameFramework/Actor.h"
#include "GameplayEffectTypes.h"
#include "AuraEffectActor.generated.h"

class UGameplayEffect;
class UAbilitySystemComponent;

UENUM(BlueprintType)
enum class EEffectApplicationPolicy : uint8 { ApplyOnOverlap,ApplyOnEndOverlap,DoNotApply  };

UENUM(BlueprintType)
enum class EEffectRemovePolicy : uint8 { RemoveOnEndOverlap,DoNotRemove  };

UCLASS()
class MYGAS_API AAuraEffectActor : public AActor
{
   GENERATED_BODY()
   
public:    
   // Sets default values for this actor's properties
   AAuraEffectActor();
   
protected:
   // Called when the game starts or when spawned
   virtual void BeginPlay() override;

   UFUNCTION(BlueprintCallable)
   void ApplyEffectToTarget(AActor* TargetActor, TSubclassOf<UGameplayEffect> GameplayEffectClass);

   UFUNCTION(BlueprintCallable)
   void OnOverlap(AActor* TargetActor);

   UFUNCTION(BlueprintCallable)
   void OnEndOverlap(AActor* TargetActor);
   
   UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="Applied Effects")
   TSubclassOf<UGameplayEffect> InstantGameplayEffectClass;

   UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="Applied Effects")
   EEffectApplicationPolicy  InstantEffectApplicationPolicy = EEffectApplicationPolicy::DoNotApply;
      
   UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="Applied Effects")
   TSubclassOf<UGameplayEffect> DurationGameplayEffectClass;

   UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="Applied Effects")
   EEffectApplicationPolicy  DurationEffectApplicationPolicy = EEffectApplicationPolicy::DoNotApply;
   
   UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="Applied Effects")
   TSubclassOf<UGameplayEffect> InfiniteGameplayEffectClass;

   UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="Applied Effects")
   EEffectApplicationPolicy  InfiniteEffectApplicationPolicy = EEffectApplicationPolicy::DoNotApply;

   UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="Applied Effects")
   EEffectRemovePolicy InfiniteEffectRemovePolicy = EEffectRemovePolicy::RemoveOnEndOverlap;

   TMap<FActiveGameplayEffectHandle , UAbilitySystemComponent*> ActiveEffectHandles;
private:
   
};

AuraEffectActor.cpp

 // Fill out your copyright notice in the Description page of Project Settings.


#include "Actor/AuraEffectActor.h"

#include "AbilitySystemBlueprintLibrary.h"
#include "AbilitySystemComponent.h"
#include "AbilitySystemInterface.h"
#include "AbilitySystem/AuraAbilitySystemComponentBase.h"
#include "AbilitySystem/AuraAttributeSet.h"
#include "Components/StaticMeshComponent.h"

 // Sets default values
AAuraEffectActor::AAuraEffectActor()
{
 // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
   PrimaryActorTick.bCanEverTick = false;
   SetRootComponent(CreateDefaultSubobject<USceneComponent>("SceneRoot"));
}

 // Called when the game starts or when spawned
void AAuraEffectActor::BeginPlay()
{
   Super::BeginPlay();
 
}

void AAuraEffectActor::ApplyEffectToTarget(AActor* TargetActor, TSubclassOf<UGameplayEffect> GameplayEffectClass)
{
   //这里是使用 UAbilitySystemBlueprintLibrary 内的静态函数,在指定的Target上查找并返回UAbilitySystemComponent
   UAbilitySystemComponent* TargetASC =  UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(TargetActor);
   if(TargetASC==nullptr) return;

   check(GameplayEffectClass);
   //创建了一个游戏效果的内容句柄,提供游戏效果的信息
   FGameplayEffectContextHandle TargetASCContext =TargetASC->MakeEffectContext();
   //把自己作为游戏效果的源对象,确保AbilitySystem可以识别到自己
   TargetASCContext.AddSourceObject(this);
   //这里创建了一个游戏效果规范,GameplayEffectClass 是要应用的游戏效果的类,1.0f 是游戏效果的初始生命周期倍率,TargetASCContext 是游戏效果的上下文. 调用 MakeOutgoingSpec 函数,将会根据提供的参数创建一个游戏效果规范
   const FGameplayEffectSpecHandle EffectSpecHandle = TargetASC->MakeOutgoingSpec(GameplayEffectClass,1.0f,TargetASCContext);
   const FActiveGameplayEffectHandle ActiveGameplayEffectHandle =  TargetASC->ApplyGameplayEffectSpecToSelf(*EffectSpecHandle.Data.Get());

   const bool bIsInfinite = EffectSpecHandle.Data.Get()->Def.Get()->DurationPolicy == EGameplayEffectDurationType::Infinite;
   if(bIsInfinite)
   {
      ActiveEffectHandles.Add(ActiveGameplayEffectHandle,TargetASC);
   }
}

void AAuraEffectActor::OnOverlap(AActor* TargetActor)
{
    if(InstantEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap)
    {
      ApplyEffectToTarget(TargetActor,InstantGameplayEffectClass);
    }
    if(DurationEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap)
    {
     ApplyEffectToTarget(TargetActor,DurationGameplayEffectClass);
    }
    if(InfiniteEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap)
    {
     ApplyEffectToTarget(TargetActor,InfiniteGameplayEffectClass);
    }
}

void AAuraEffectActor::OnEndOverlap(AActor* TargetActor)
{
    if(InstantEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap)
    {
     ApplyEffectToTarget(TargetActor,InstantGameplayEffectClass);
    }
    if(DurationEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap)
    {
     ApplyEffectToTarget(TargetActor,DurationGameplayEffectClass);
    }
    if(InfiniteEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap)
    {
     ApplyEffectToTarget(TargetActor,InfiniteGameplayEffectClass);
    }
    if(InfiniteEffectRemovePolicy == EEffectRemovePolicy::RemoveOnEndOverlap)
    {
        //获取到目标角色的能力组件
        UAbilitySystemComponent* TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(TargetActor);
        if(!IsValid(TargetASC)) return;
        //创建了一个储存移除游戏效果句柄的数组 HandlesToRemove
        TArray<FActiveGameplayEffectHandle> HandlesToRemove;
        //遍历 ActiveEffectHandles 数组
        for(TTuple<FActiveGameplayEffectHandle, UAbilitySystemComponent*> HandlePair:ActiveEffectHandles)
        {
             // 当 TargetASC 内有 HandlePair.Value的值的时候
             if(TargetASC == HandlePair.Value)
             {
                 // 移除 HandlePair 的效果
                 TargetASC->RemoveActiveGameplayEffect(HandlePair.Key, 1);
                 //把这个效果放在 HandlesToRemove 中
                 HandlesToRemove.Add(HandlePair.Key);
             }
        }
        // 遍历 HandlesToRemove 内的每一个元素
        for(auto& Handle : HandlesToRemove)
        {
             // 在 ActiveEffectHandles 这个数组内移除
             ActiveEffectHandles.FindAndRemoveChecked(Handle);
             
        }
    }
 }
 
      

创建GE_FireArea和BP_FireArea

FireArea需要把Applied Effects设置喂Apply Overlay

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

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

相关文章

Linux驱动开发:掌握SPI通信机制

目录标题 1、SPI简介2、SPI通信机制3、Linux内核中的SPI支持4、SPI核心API5、SPI控制器驱动6、SPI设备驱动 7、编写SPI设备驱动8、调试SPI驱动 在Linux驱动开发中&#xff0c;串行外设接口(SPI)是一种常见的高速全双工通信协议&#xff0c;用于连接处理器和各种外设。本文将深入…

React【Day4下+5】

环境搭建 使用CRA创建项目&#xff0c;并安装必要依赖&#xff0c;包括下列基础包 Redux状态管理 - reduxjs/toolkit 、 react-redux路由 - react-router-dom时间处理 - dayjsclass类名处理 - classnames移动端组件库 - antd-mobile请求插件 - axios pnpm i reduxjs/toolkit r…

企业规模扩大,SD-WAN实现跨省快速组网

随着数字化时代的飞速发展&#xff0c;企业面临着前所未有的挑战与机遇。5G、VoIP、AI和物联网等新技术的兴起&#xff0c;不仅改变了商业格局&#xff0c;也对企业网络提出了更高的要求。随着企业规模的不断扩大&#xff0c;企业如何搭建跨省的、高性能、超融合、简化运维的组…

防火墙技术基础篇:认识安全策略、安全区域、域间转发及报文转发流程

防火墙技术基础篇&#xff1a;认识安全策略、安全区域、域间转发及报文转发流程 一、安全策略匹配机制 简单通俗的讲&#xff0c;防火墙设备最基本的用途就是定义数据如何转发&#xff0c;靠什么定义呢&#xff1f;最基本的就是安全策略&#xff0c;当流量来到防火墙之后首先…

LeetCode_链表的回文结构

✨✨所属专栏&#xff1a;LeetCode刷题专栏✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 题目描述&#xff1a; 对于一个链表&#xff0c;请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法&#xff0c;判断其是否为回文结构。给定一个链表的头指针A&#xff0c;请返回一个bo…

Edge下载文件提示无法安全下载的解决方法

问题描述&#xff1a;最近Edge在下载文件时总是提示&#xff1a;无法安全下载&#xff0c;本文记录一下解决方法。 提示截图&#xff1a; 解决方式一&#xff1a; 1. 点击下图红框的三个点&#xff0c;选择保留 2. 选择仍然保留 解决方式二&#xff1a; 第一种方式每下载一次…

微信小程序中,plugins 配置项如何配置多个插件

在微信小程序中&#xff0c;如果需要配置多个插件&#xff0c;你可以在 app.json 文件的 plugins 配置项中为每个插件指定一个唯一的自定义名称&#xff0c;并分别提供它们的 version 和 provider 信息。下面是一个配置多个插件的示例&#xff1a; json复制代码 { "pages…

Python 0基础_变现_38岁_day 16(文件操作)

在python&#xff0c;使用内置函数open()进行文件的一些读写操作 文件操作格式&#xff1a;open(文件路径&#xff0c;访问模式&#xff0c;字符编码) 前面两个参数是必备参数&#xff0c;后面的字符编码为选填&#xff0c;但是大多数情况下都会协商字符编码 访问模式 r 只读 w…

如何看待AIGC技术

目录 1.概述 2.技术应用 2.1.媒体与内容创作 2.2.教育与学习 ​​​​​​​2.3.艺术创作 ​​​​​​​2.4.游戏产业 ​​​​​​​2.5.工业设计 ​​​​​​​2.6.对未来社会的影响 2.7.可能的发展方向 ​​​​​​​2.8.小结 3.伦理与风险 3.1.AIGC技术面临…

科研工作学习中常用的录制动图软件——screenToGif

一、前言 俗话说&#xff0c;字不如表&#xff0c;表不如图&#xff0c;静图不如动图。 动图给人的直观感受&#xff0c;还是很不错的。在曾经的学生期间&#xff0c;进行组会汇报&#xff1b;还是如今工作中&#xff0c;给领导汇报。我经常使用screenToGif这款软件&#xff…

基于STM32F4系列的ETH IAP在线升级程序

目录 1、前言 2、以太网的移植&#xff08;无操作系统&#xff09; 3、移植FATS 系统 4、移植ETH 驱动及 DP83848驱动 5、Tftp 服务程序 6、注意事项 ​7、代码 资料下载地址&#xff1a;基于STM32F4系列的ETH IAP在线升级程序 1、前言 此bootloader程序可以通过http…

数字科技助力垃圾分类展厅,增强内容交互新体验!

如今&#xff0c;许多行业都开始运用数字技术&#xff0c;探索其在展览展示领域中的应用&#xff0c;其中垃圾分类展厅作为现代城市文明建设的重要一环&#xff0c;也通过这些技术的运用&#xff0c;打造出了更加生动且富有科技感的展示空间&#xff0c;它不仅提升公众对垃圾分…

TCP详解

2.1TCP 由IETF的RFC793定义的传输控制协议&#xff08;Transmission Control Protocol&#xff0c;TCP&#xff09;是一种基于字节流的传输层通信协议。在传输数据前需要在发送与接收者之间建立连接&#xff0c;通过相应机制保证其建立连接的可靠性。 TCP协议具备以下特性&am…

信息化工作人员必备常识8——DNS缓存【查看缓存与清理dns缓存】

信息化工作人员必备常识8——DNS缓存【查看缓存与清理dns缓存】 前言信息化人员必备常识回顾&#xff08;不想看回顾的直接往下滑哦~&#xff09;pingtelnetnslookup命令ipconfig命令域名DNS DNS缓存主机上解析DNS的优先级 清理DNS缓存查看当前电脑有哪些DNS缓存 前言 信息化相…

【超详细保姆教程】手把手教你如何修改el-tab的默认样式,把el-tab的label变成我们想要的

目录 前言实现效果官方的样式修改后的结果 步骤1、去掉分割线和下划线去掉前去掉后 2、设置插槽&#xff0c;自定义label的内容&#xff0c;加上border等结果 3、为选中的tab修改高亮结果 前言 做前端实习也有一段时间了&#xff0c;昨天晚上在学校上项目工程管理这门课的时候…

Edge浏览器下载文件提示 “无法安全下载” 的解决方法

提示如下&#xff1a; 虽然我们可以通过 "保留" 进行下载&#xff0c;但是每次需要选择&#xff0c;比较麻烦 解决方法&#xff1a; 1、打开注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft 2、创建2个 "项" Edge\InsecureContentAllowedForUrls…

数据链路层(计算机网络,待完善)

0、前言 本文大多数图片都来自于 B站UP主&#xff1a;湖科大教书匠 的教学视频&#xff0c;对高军老师及其团队制作出这么优质的课程表示感谢。文章增加了部分个人理解&#xff0c;内容并不是对视频的静态化翻译。 1、概述 1.1、数据链路层在计算机网络体系中的位置 1.2、对…

手机照片删除了怎么恢复?教你3个招!

我们使用手机的时间在变长&#xff0c;手机里储存的数据也会越来越多&#xff0c;所以一旦手机卡顿&#xff0c;我们往往会选择清理垃圾的方式来释放内存。如果不小心把照片清理了怎么办呢&#xff1f;手机照片删除了怎么恢复呢&#xff1f;别着急&#xff0c;这个问题小编会&a…

泰坦尼克号乘客生存预测 中

背景描述 泰坦尼克号轮船的沉没是历史上最为人熟知的海难事件之一。1912年4月15日&#xff0c;在她的处女航中&#xff0c;泰坦尼克号在与冰山相撞后沉没&#xff0c;在船上的 2224 名乘客和机组人员中&#xff0c;共造成 1502 人死亡。这场耸人听闻的悲剧震惊了国际社会&…

js 连接快手打印组件并实现打印

快手打印组件文档&#xff1a; https://docs.qingque.cn/d/home/eZQA41D2h9LGUFaD26bC07e–?identityIdEmukFTnlEF#sectionh.kgnfm4rjc89m 快手打印组件下载&#xff1a; https://docs.qingque.cn/d/home/eZQBMOMSj4mJ5D7Xplofq-p4Y?identityIdEmukFTnlEF 快手打印数据格式&…