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

news2025/1/12 23:38:01

这节课主要是怎么对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.coloradmin.cn/o/1623668.html

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

相关文章

前端常用样式组元SCSS

* { margin: 0; padding: 0; border: 0; box-sizing: border-box; } #主题色 $primary: #183ee4; $success: #0cce63; $danger: #f00c63; mixin setThemeBgColor($name, $oClor, $start, $end) { .#{$name}-color { color: $oClor } .#{$name}-color-active { color: dark…

MATLAB非均匀网格梯度计算

在matlab中&#xff0c;gradient函数可以很方便的对均匀网格进行梯度计算&#xff0c;但是对于非均匀网格&#xff0c;但是gradient却无法求解非均匀网格的梯度&#xff0c;这一点我之前犯过错误。我之前以为在gradient函数中指定x&#xff0c;y等坐标&#xff0c;其求解的就是…

《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制婴儿性别比例饼图

在MATLAB 中可以使用 pie 函数来创建饼图。饼图是一种展示不同部分占总体的相对比例的图表。 本示例从“婴儿出生数据.csv”文件读取婴儿出生数据&#xff0c;然后计算男性和女性婴儿的数量&#xff0c;使用MATLAB绘制饼图。 配套图书链接&#xff1a;https://item.jd.com…

用c++实现起泡排序、哈密顿回路问题、TSP问题

5.3.2 起泡排序 【问题】 起泡排序(bubble sort)的基本思想是&#xff1a;两两比较相邻记录&#xff0c;如果反序则交换&#xff0c;直至没有反序的记录&#xff0c;如图5.8所示。【想法】下表给出了一个起泡排序的例子&#xff08;方括号括起来的为无序区&#xff09;&#x…

数组模拟几种基本的数据结构

文章目录 数组模拟单链表数组模拟双链表数组实现栈数组模拟队列总结 数组模拟单链表 首先类比结构体存储单链表&#xff0c;我们需要一个存放下一个节点下标的数组&#xff0c;还需要一个存储当前节点的值的数组&#xff0c;其次就是一个int类型的索引&#xff0c;这个索引指向…

【智能算法】金豺优化算法(GJO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年&#xff0c;N Chopra等人受到金豺狩猎行为启发&#xff0c;提出了金豺优化算法&#xff08;Golden Jackal Optimization, GJO&#xff09;。 2.算法原理 2.1算法思想 GJO 模拟金豺协同狩猎…

vlan的学习笔记2(vlan间通信)

1.使用路由器的物理接口 原理&#xff1a;在二层交换机上配置VLAN&#xff0c;每个VLAN单独使用一个交换机接口与路由器互联。路由器使用两个物理接口&#xff0c;分别作为VLAN 10及VLAN 20内PC的默认网关&#xff0c;使用路由器的物理接口实现VLAN之间的通信。 实验1&#x…

关于后台管理系统的一些系统监控案例

关于后台管理系统的一些系统监控案例 在阅读开源的项目的时候&#xff0c;发现了一个很神奇的功能。 https://github.com/valarchie/AgileBoot-Back-End 我这个是本地去运行的&#xff0c;发现他可以检测到这么多的数据 下面我们就来看他是如何进行的这样一个检测 我们首先…

美国网站服务器解决方案

在当今互联网时代&#xff0c;网站是企业宣传、营销和销售的最好方式&#xff0c;因此&#xff0c;选择一个适合自己企业的网站服务器解决方案很重要。美国作为全球网络基础设施最发达的国家之一&#xff0c;其网站服务器解决方案具有以下特点&#xff1a; 一、安全性高 作为全…

【C# 类和方法】

在C#中&#xff0c;类是面向对象编程的核心概念之一&#xff0c;允许定义对象的结构和行为。类是创建对象的蓝图&#xff0c;它包含了数据成员&#xff08;属性&#xff09;和方法。 C#类的定义示例&#xff1a; public class Person {// 属性&#xff08;字段&#xff09;pub…

校园一卡通解决方案概述

在20世纪数字化的时代背景之下&#xff0c;校园管理需要跟随时代的脚步共同向智能化方向迈进。现在学校的环境都在不断的升级扩展&#xff0c;各种教学设备不断的被纳入校园管理体系中&#xff0c;让校园管理的规模和内容不断的膨胀。在这种环境下&#xff0c;如果继续按照以前…

vue3+node.js+mysql+ant design实现表格的查询功能

今日主要分享如何运用vue、nodejs、mysql及ant design构建表格数据查询功能&#xff0c;这也是众多项目开发者关注的问题。最关键在于前端与后端的协作&#xff0c;后端数据则通过nodejs编写。尽管涉及多项技术&#xff0c;看似复杂&#xff0c;但实际操作却并非困难。当然&…

区块链 | OpenSea 相关论文:Toward Achieving Anonymous NFT Trading(三)

&#x1f951;原文&#xff1a; Toward Achieving Anonymous NFT Trading VII 讨论&#xff1a;关于匿名性与市场平台的困境 在本文的这一部分&#xff0c;我们将讨论关于隐藏 NFT 所有者地址的困境&#xff0c;以及为什么像 OpenSea 这样的 NFT 市场平台几乎必须得到完全的信…

Redis中的Lua脚本(六)

Lua脚本 清空repl_scriptcache_dict字典 每当主服务器添加一个新的从服务器时&#xff0c;主服务器都会清空自己的repl_scriptcache_dict字典&#xff0c;这是因为随着新从服务器的出现&#xff0c;repl_scriptcache_字典里面记录的脚本已经不再被所有从服务器载入过&#xf…

mongodb 安装问题

1. mongodb启动时显示 Illegal instruction (core dumped) mongodb 5.0之后(包括5.0) 开始使用需要使用 AVX 指令集 2.启动时报错 ERROR: child process failed, exited with 1 通过指令 bin/mongod --repair 或 ./bin/mongod -f configs/mongodb.conf --repair查看报错信息…

电力系统IEC-104报文主要常用详解

文章目录 1️⃣ IEC-1041.1 前言1.2 报文分类1.3 U帧报文1.3.1 常见报文1.3.1 报文解析 1.4 S帧报文1.4.1 说明1.4.2 报文解析 1.5 I帧报文1.5.1 报文解析 1.6 控制域I帧报文S帧报文U帧报文介绍 1.7 ASDU1.7.1 常见类型标识1.7.2 常见结构限定词1.7.3 常见传送原因1.7.4 信息体…

主食冻干哪个国家的好?全网热销款品控好的主食冻干必买

主食冻干哪个国家的好&#xff1f;谈及主食冻干哪款好&#xff0c;进口的主食冻干总是能被提名。不论是在哪个电商平台搜索“主食冻干”&#xff0c;都会发现那些备受推崇是进口主食冻干。从销售数据上看&#xff0c;这些进口冻干在大型促销活动如双11、618中的销量一直居高不下…

ctfshow菜狗杯 web 无算力以及easyPytHon_P

web签到题 error_reporting(0); highlight_file(__FILE__);eval($_REQUEST[$_GET[$_POST[$_COOKIE[CTFshow-QQ群:]]]][6][0][7][5][8][0][9][4][4]);套娃传参 中文要编码 Cookies &#xff1a;CTFshow-QQ%E7%BE%A4:a POST:ab GET:?bc&c[6][0][7][5][8][0][9][4][4]syste…

eNSP学习——静态路由及默认路由基本配置

目录 知识背景 实验目的 实验步骤 实验内容 实验拓扑 实验编址 实验前期准备 实验步骤 1、基本配置&#xff08;按照实验编址设置好对应的IP地址&#xff09; 2、是实现主机之间的通信 3、实现全网全通来增强网络的可靠性 4、使用默认路由实现简单的网络优化 需要各…

ROS摄像机标定

文章目录 一、环境准备二、摄像头标定2.1 为什么要标定2.2 标定前准备2.2.1 标定板2.2.2 摄像头调焦 2.3 开始标定2.4 测试标定结果 总结参考资料 一、环境准备 安装usb_cam相机驱动 sudo apt-get install ros-noetic-usb-cam 安装标定功能包 sudo apt-get install ros-noet…