P44,45 属性预处理,执行后游戏效果回调,附录指定区域内修改变量

这节课主要是怎么对Attribute进行在进行到游戏角色前先进行处理,以及游戏效果如何回调

AuraAttributeSet.h

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

#pragma once

 #include "CoreMinimal.h"
#include "AttributeSet.h"
#include "AbilitySystemComponent.h"
#include "GameFramework/Character.h"
#include "AuraAttributeSet.generated.h"


#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
   GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
   GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
   GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
   GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)

/**
 * 
 */
//这里是一个结构体
USTRUCT()
struct  FEffectProperties
{
   GENERATED_BODY()
   FEffectProperties(){}

   FGameplayEffectContextHandle EffectContextHandle;

   UPROPERTY()
   UAbilitySystemComponent* SourceASC = nullptr;

   UPROPERTY()
   AActor* SourceAvatarActor = nullptr;

   UPROPERTY()
   AController* SourceController = nullptr;

   UPROPERTY()
   ACharacter* SourceCharacter = nullptr;

   UPROPERTY()
   UAbilitySystemComponent* TargetASC = nullptr;

   UPROPERTY()
   AActor* TargetAvatarActor = nullptr;

   UPROPERTY()
   AController* TargetController = nullptr;

   UPROPERTY()
   ACharacter* TargetCharacter = nullptr;
};

UCLASS()
class MYGAS_API UAuraAttributeSet : public UAttributeSet
{
     GENERATED_BODY()
 public:
   UAuraAttributeSet();
   virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;

   virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;

   virtual void PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data) override;
   
   //创建AttributeData属性,并且是可以被复制的
   UPROPERTY(BlueprintReadOnly,ReplicatedUsing = OnRep_Health ,Category="Vital Attributes")
   FGameplayAttributeData Health;
   ATTRIBUTE_ACCESSORS(UAuraAttributeSet,Health);
   
   UPROPERTY(BlueprintReadOnly,ReplicatedUsing = OnRep_MaxHealth ,Category="Vital Attributes")
   FGameplayAttributeData MaxHealth;
   ATTRIBUTE_ACCESSORS(UAuraAttributeSet,MaxHealth);

   UPROPERTY(BlueprintReadOnly,ReplicatedUsing = OnRep_Mana ,Category="Vital Attributes")
   FGameplayAttributeData Mana;
   ATTRIBUTE_ACCESSORS(UAuraAttributeSet,Mana);
   
   UPROPERTY(BlueprintReadOnly,ReplicatedUsing = OnRep_MaxMana ,Category="Vital Attributes")
   FGameplayAttributeData MaxMana;
   ATTRIBUTE_ACCESSORS(UAuraAttributeSet,MaxMana);
   
   UFUNCTION()
   void OnRep_Health(const FGameplayAttributeData& OldHealth) const;

   UFUNCTION()
   void OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth) const;

   UFUNCTION()
   void OnRep_Mana(const FGameplayAttributeData& OldMana) const;

   UFUNCTION()
   void OnRep_MaxMana(const FGameplayAttributeData& OldMaxMana) const;

private:
   void SetEffectProperties(const FGameplayEffectModCallbackData& Data , FEffectProperties& Props) const;
};

AuraAttributeSet.cpp

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


#include "AbilitySystem/AuraAttributeSet.h"

#include "AbilitySystemBlueprintLibrary.h"
#include "GameplayEffectExtension.h"
#include "GameFramework/Character.h"
#include "GameFramework/Pawn.h"
#include "Net/UnrealNetwork.h"
#include "PlayerController/AuraPlayerController.h"

UAuraAttributeSet::UAuraAttributeSet()
{
   InitHealth(50.f);
   InitMaxHealth(100.f);
   InitMana(25.f);
   InitMaxMana(50.f);
   
}

void UAuraAttributeSet::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
   //用来表示在Actor生命周期内要复制的属性,被创建并且复制的时候在网络上进行同步,确保客户端和服务端状态一致
   Super::GetLifetimeReplicatedProps(OutLifetimeProps);
   //这是一个宏,用来表现属性的复制条件和什么时候调用RepNotify,其中Cond指属性什么时候进行复制,Repnotify是指什么时候调用RepNotify函数,这里是Always,只要服务器接收到属性值就调用复制
   DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet,Health,COND_None,REPNOTIFY_Always);
   
   DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet,MaxHealth,COND_None,REPNOTIFY_Always);
   
// DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet,Mana,COND_None,REPNOTIFY_Always);
   
// DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet,MaxMana,COND_None,REPNOTIFY_Always);
   
}
//数值在应用到角色前进行修改 
void UAuraAttributeSet::PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue)
{
   Super::PreAttributeChange(Attribute, NewValue);
   //限制 health和Mana的最低值和最高值
   if(Attribute == GetHealthAttribute())
   {
      NewValue = FMath::Clamp(NewValue,0.f,GetMaxHealth());
   }
   if(Attribute == GetManaAttribute())
   {
      NewValue = FMath::Clamp(NewValue,0.f,GetMaxMana());
   }
}

void UAuraAttributeSet::SetEffectProperties(const FGameplayEffectModCallbackData& Data, FEffectProperties& Props) const
{
   // Source = causer  of the effect , Targetg = Target of the Effect (owner of this AS) 效果的上下文处理,包括来源和目标
   Props.EffectContextHandle = Data.EffectSpec.GetContext();
   // 获取效果的来源能力系统组件
   Props.SourceASC =Props.EffectContextHandle.GetOriginalInstigatorAbilitySystemComponent();
   // 如果有效,则获取来源的相关信息
   if(IsValid(Props.SourceASC) && Props.SourceASC->AbilityActorInfo.IsValid() && Props.SourceASC->AbilityActorInfo->AvatarActor.IsValid())
   {
      Props.SourceAvatarActor = Props.SourceASC->AbilityActorInfo->AvatarActor.Get();
      Props.SourceController = Props.SourceASC->AbilityActorInfo->PlayerController.Get();
      // 如果来源控制器为空且存在角色,则获取角色的控制器
      if(Props.SourceController == nullptr && Props.SourceAvatarActor != nullptr)
      {
         if(const APawn* Pawn = Cast<APawn>(Props.SourceAvatarActor))
         {
            Props.SourceController = Pawn->GetController();
         }
      }
      // 如果存在来源控制器,则尝试将其转换为角色
      if(Props.SourceController)
      {
         Props.SourceCharacter = Cast<ACharacter>(Props.SourceController->GetPawn());
      }
   }
   // 获取目标的相关信息
   if(Data.Target.AbilityActorInfo.IsValid() && Data.Target.AbilityActorInfo->AvatarActor.IsValid())
   {
      Props.TargetAvatarActor = Data.Target.AbilityActorInfo->AvatarActor.Get();
      Props.TargetController = Data.Target.AbilityActorInfo->PlayerController.Get();
      Props.TargetCharacter = Cast<ACharacter>(Props.TargetAvatarActor);
      Props.TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(Props.TargetAvatarActor);
      
   }
   
   //这里是用来Debug对生命值产生的数值
   /*if(Data.EvaluatedData.Attribute == GetHealthAttribute())
   {
      UE_LOG(LogTemp , Warning , TEXT("Health from GetHealth :%f"), GetHealth());
      UE_LOG(LogTemp , Warning , TEXT("Magnitude :%f"), Data.EvaluatedData.Magnitude);
   }*/
}
 
void UAuraAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
{
   Super::PostGameplayEffectExecute(Data);
   FEffectProperties Props;
   SetEffectProperties(Data,Props);
}

void UAuraAttributeSet::OnRep_Health(const FGameplayAttributeData& OldHealth) const
{
   //这是一个宏,当对象在服务端发生变化的时候可以复制到所有客户端上
   GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,Health,OldHealth);
}

void UAuraAttributeSet::OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth) const
{
   GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,MaxHealth,OldMaxHealth);
}

void UAuraAttributeSet::OnRep_Mana(const FGameplayAttributeData& OldMana) const
{
   GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,Mana,OldMana);
}

void UAuraAttributeSet::OnRep_MaxMana(const FGameplayAttributeData& OldMaxMana) const
{
   GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,MaxMana,OldMaxMana);
}


      

附录

Ctrl + h 指定区域内替换关键字

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何禁用WordPress的自动更新(包括主题、插件和核心文件)

这几天发现我的一个网站突然打不开了&#xff0c;提示“此站点遇到了致命错误”,如图&#xff1a; 这个网站一直都是正常运行的&#xff0c;最近也没有过什么更新&#xff0c;按理说不应该会出现问题&#xff0c;我担心可能是主机方面做了什么调整导致&#xff0c;所以联系了Ho…

品鉴中的个人偏好:如何找到适合自己的红酒风格

品鉴红酒时&#xff0c;个人偏好起着至关重要的作用。不同的人对红酒的风格、口感和特点有着不同的喜好和需求。对于云仓酒庄雷盛红酒而言&#xff0c;如何找到适合自己的红酒风格&#xff0c;是品鉴过程中需要关注的问题。 首先&#xff0c;了解自己的口味和喜好是找到适合自己…

spi接口的基本概念、引脚定义及注意事项

目录 基本概念 引脚定义 注意事项 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种同步串行接口技术&#xff0c;广泛应用于微控制器和各种外围设备之间的短距离通信。 基本概念 SPI接口允许微控制器以串行方式与一个或多个外围设备进行通信。它是一种高速、…

B端:销售投入远超研发投入,想让B端漂亮体验好,非常难。

足够的研发费用是确保B端系统研发体验好、品质佳的重要条件之一。在B端系统研发过程中&#xff0c;足够的研发费用可以用于以下方面&#xff1a; 1.人才投入&#xff1a; 招聘高素质的研发团队成员&#xff0c;包括开发工程师、测试工程师、产品设计师、运维工程师等&#xf…

【进程通信】利用管道创建进程池(结合代码)

文章目录 什么叫进程池进程池的优点 创建进程池代码实现&#xff1a; 什么叫进程池 我们知道&#xff0c;一个进程创建子进程通常是为了让这个子进程去为它完成某个任务。例如我们使用的指令&#xff0c;其实就是bash进程创建子进程让子进程去执行的。但是我们需要考虑这样一个…

RLDP协议原理与应用

RLDP概述 l RLDP全称是Rapid Link Detection Protocol&#xff08;快速链路检测协议&#xff09;&#xff0c;是锐捷网络自主开发的&#xff0c;用于快速检测以太网链路故障的链路协议。 l 一般的以太网链路检测机制都只是利用物理连接的状态&#xff0c;通过物理层的自动协…

React | classnames

classnames 这个库在我们的项目中有大量的使用到&#xff0c;它不仅很实用&#xff0c;还非常好用&#xff0c;但还有人不知道这个库&#xff0c;我真的是十分心痛。 通过 classnames&#xff0c;我们可以给组件设置多个 className&#xff0c;还可以根据需要动态设置 classNa…

机器学习中的CatBoost算法

我们经常遇到包含分类特征的数据集&#xff0c;为了将这些数据集拟合到Boosting模型中&#xff0c;我们对数据集应用各种编码技术&#xff0c;例如One-Hot编码或标签编码。但是应用One-Hot编码会创建一个稀疏矩阵&#xff0c;这有时可能导致模型的过拟合&#xff0c;我们使用Ca…

Oracle中rman使用记录

最近在项目中&#xff0c;遇到使用RMAN的操作来恢复数据库中某个时间归档日志&#xff0c;RMAN的原理和理解&#xff0c;网友们百度了解一下。我重点将实操部分了。直接上实验环节&#xff0c;让网友更懂。&#xff08;特别提醒&#xff1a;我是1:1用VMware克隆数据库进行RMAN还…

分布式与一致性协议之Paxos算法(三)

Paxos算法 兰伯特关于Multi-Paxos的思考 领导者 我们可以通过引入领导者(Leader)节点来解决第一个问题。也就是说将领导者节点作为唯一提议者&#xff0c;如图所示。这样就不存在多个提议者同时提交提案的情况&#xff0c;也就不存在提案冲突的情况了。这里补充一点:在论文中…

开发规范:API安全

开发规范&#xff1a;API安全 API是现代移动、SaaS和web应用程序的关键组成部分&#xff0c;可以应用在面向客户、合作伙伴和内部应用程序中。API可以暴露应用程序逻辑和敏感数据。不安全的API很容易成为黑客攻击的目标&#xff0c;使他们能够访问安全的服务器或网络。攻击者可…

NXP i.MX8系列平台开发讲解 - 3.9 Linux PCIe协议相关介绍(二)

目录 1. PCIe 传输层协议 2. TLP介绍 2.1 TLP包格式 2.2 TLP包的种类 2.3 TLP 包传输例子 2.4 TLP 路由规则 根据上一章的知识&#xff0c;对于PCIe的发展和基础知识有了大概了解&#xff0c;本章节将会讲解PCIe的一些工作原理&#xff0c;使用的协议&#xff0c;通信交互…

挑战一周完成Vue3项目Day2:路由配置+登录模块+layout组件+路由鉴权

一、路由配置 经过分析&#xff0c;项目一共需要4个一级路由&#xff1a;登录&#xff08;login&#xff09;、主页&#xff08;home&#xff09;、404、任意路由&#xff08;重定向到404&#xff09;。 1、安装路由插件 pnpm install vue-router 2、创建路由组件 在src目…

dremio数据湖sql行列转换及转置

1、行转列 (扁平化) 数据准备 表 aa 1.1 cross join unnest 在Dremio中&#xff0c;UNNEST 函数用于将数组或复杂类型的列&#xff08;如JSON、Map或Array类型&#xff09;中的值“炸裂”&#xff08;分解&#xff09;成多行. with aa as ( select 上海 as city, ARRAY[浦东…

2024程诺申论突击理论刷题班

2024程诺申论突击理论刷题班&#xff0c;为备考者提供了系统而高效的申论学习平台。在这个班里&#xff0c;程诺老师以其深厚的理论功底和丰富的教学经验&#xff0c;引导我们深入理解申论的本质和技巧。刷题环节精心设计&#xff0c;让我们在实战中巩固知识&#xff0c;提升能…

Professional CUDA C Programming

2023/4/28 1.使用nvfrof时&#xff0c;报错 解决方法&#xff1a; 将路径 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\extras\CUPTI\lib64 下的文件cupti64_2020.2.0.dll复制到路径 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\bin下即可。 2…

Innodb底层原理与Mysql日志机制到底怎么个事???

在学完Innodb底层原理与Mysql日志机制&#xff0c;自己进行总结&#xff0c;画了一张脑图&#xff0c;思路清晰许多 希望对大家也能有点帮助

Visual Studio Code基础:打开一个编辑器(文件)时,覆盖了原编辑器

相关阅读 VS codehttps://blog.csdn.net/weixin_45791458/category_12658212.html?spm1001.2014.3001.5482 在使用vscode时&#xff0c;偶尔会出现这样的问题&#xff1a;打开了某个编辑器&#xff08;文件&#xff0c;下面统称文件&#xff09;后&#xff0c;再打开其他文件…

安装JAVA和java IDEA并汉化过程

1.安装java: 打开java的下载链接&#xff1a; Java Downloads | Oracle 然后选择对应的版本下载即可&#xff0c;我这里是windows 所以下载这个 然后正常一步步安装即可。 2.配置java环境&#xff1a; 在桌面右键此电脑然后点击属性——高级系统设置——环境变量——然后…

ACE框架学习3

ACE Acceptor-Connector框架 该框架实现 Acceptor-Connector 模式&#xff0c;该模式解除了“网络化应用中的协作对端服务的连接和初始化”与“连接和初始化之后它们所执行的处理”的耦合。Acceptor-Connector 框架允许成用独立于它们所提供的服务来配置其连接布局的关键属性。…