6. UE5 RPG AttributeSet的设置

AttributeSet 负责定义和持有属性并且管理属性的变化。开发者可以子类化UAttributeSet。在OwnerActor的构造方法中创建的AttributeSet将会自动注册到ASC。这一步必须在C++中完成。

Attributes 是由 FGameplayAttributeData定义的浮点值。 Attributes能够表达从角色的生命值到角色等级到药瓶的价格等任何数值。 如果Actor拥有游戏性相关的数值,那么可以考虑使用Attribute。Attributes 通常只能被GameplayEffects 修改,因此ASC可以 预测 这个修改。

一个Attribute 由两个值构成 - 一个基值 BaseValue 和一个当前值CurrentValue. 基值BaseValue是属性 Attribute的一个恒值, 而当前值 CurrentValue 是 BaseValue 加上GameplayEffects的临时修改值。

立即(Instant) GameplayEffects将永久改变BaseValue,而持续(Duration) 和永恒(Infinite) GameplayEffects 将改变CurrentValue。周期性(Periodic )GameplayEffects像立即(Instant) GameplayEffects一样将改变BaseValue。
这里官方文档也说的不大清楚,如果Attribute没有受到GameplayEffects的影响时,这两个值其实是相同的。而受到GameplayEffects影响时,如果是一次性的修改,则直接修改的时候BaseValue,CurrentValue也会跟着改变,两个值的结果相同。如果影响是时效性的,比如一段时间内提高移动速度,那么,GameplayEffects修改的是CurrentValue的值。

定义AttributeSet属性

AttributeSetBase.h

// 版权归暮志未晚所有。#pragma once#include "CoreMinimal.h"
#include "AttributeSet.h"
#include "AbilitySystemComponent.h"
#include "AttributeSetBase.generated.h"// Uses macros from AttributeSet.h
#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)/*** */
UCLASS()
class AURA_API UAttributeSetBase : public UAttributeSet
{GENERATED_BODY()public:UAttributeSetBase();virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;UPROPERTY(BlueprintReadOnly,ReplicatedUsing = OnRep_Health, Category="Vital Attributes")FGameplayAttributeData Health;ATTRIBUTE_ACCESSORS(UAttributeSetBase, Health);UPROPERTY(BlueprintReadOnly,ReplicatedUsing = OnRep_MaxHealth, Category="Vital Attributes")FGameplayAttributeData MaxHealth;ATTRIBUTE_ACCESSORS(UAttributeSetBase, MaxHealth);UFUNCTION()void OnRep_Health(const FGameplayAttributeData& OldHealth) const;UFUNCTION()void OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth) const;
};

AttributeSetBase.cpp

// 版权归暮志未晚所有。#include "AbilitySystem/AttributeSetBase.h"
#include "Net/UnrealNetwork.h"UAttributeSetBase::UAttributeSetBase()
{InitHealth(100.f);InitMaxHealth(100.f);InitMana(100.f);InitMaxMana(100.f);
}void UAttributeSetBase::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{Super::GetLifetimeReplicatedProps(OutLifetimeProps);DOREPLIFETIME_CONDITION_NOTIFY(UAttributeSetBase, Health, COND_None, REPNOTIFY_Always);DOREPLIFETIME_CONDITION_NOTIFY(UAttributeSetBase, MaxHealth, COND_None, REPNOTIFY_Always);
}void UAttributeSetBase::OnRep_Health(const FGameplayAttributeData& OldHealth) const
{GAMEPLAYATTRIBUTE_REPNOTIFY(UAttributeSetBase, Health, OldHealth);
}void UAttributeSetBase::OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth) const
{GAMEPLAYATTRIBUTE_REPNOTIFY(UAttributeSetBase, MaxHealth, OldMaxHealth);
}

在上面的代码中,我创建了两个属性,一个是Health,用来表示角色的当前血量,另一个是MaxHealth,代表角色的最大血量。
在这里插入图片描述
宏的设置,编译时会默认给变量生成相应的Getter以及Setter函数,当前设置会生成四个函数,获取属性,获取值,设置值,以及初始化值。
在这里插入图片描述
变量的OnRep 函数调用GAMEPLAYATTRIBUTE_REPNOTIFY 宏才能使用预测系统
在这里插入图片描述
Attribute 需要被添加到GetLifetimeReplicatedProps中,COND_None 为触发没有条件限制,REPTNOTIFY_Always 告诉 OnRep 方法在本地值和服务器下发的值即使已经相同也会触发(为了预测),默认情况下OnRep不会触发
如果只是做单机,不需要与服务器同步复制,那么OnRep 和GetLifetimeReplicatedProps可以被跳过。

验证属性

在这里插入图片描述

运行游戏,按一下~,输入showdebug abilitysystem。
在这里插入图片描述
在最上面一行,显示当前控制角色的AvatarActor和OwnerActor。
我们还可以通过Page Up和Page Down按钮切换查看目标。
在左下角,则可以查看到我们修改的属性的数值。

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

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

相关文章

harbor https

harbor https部署 准备docker-compose安装https 证书harbor安装访问harbor推镜像到harbor 准备 192.168.112.99&#xff0c;harbor&#xff0c;centos7 192.168.112.3&#xff0c;测试机&#xff0c;centos7 docker版本&#xff1a;docker-ce 20.10.16&#xff08;部署参考&a…

AOI与AVI:在视觉检测中的不同点和相似点

AOI&#xff08;关注区域&#xff09;和AVI&#xff08;视觉感兴趣区域&#xff09;是视觉检测中常用的两个概念&#xff0c;主要用于识别和分析图像或视频中的特定区域。虽然这两个概念都涉及到注视行为和注意力分配&#xff0c;但它们在定义和实际应用等方面有一些差异。 AOI…

【轮式平衡机器人】——软硬件配置/准备

本系列以轮式平衡移动机器人为例&#xff0c;将使用基于模型设计&#xff08;MBD&#xff09;方法进行介绍&#xff0c;涉及基础硬件、软件、控制算法等多方面内容&#xff0c;结合MATLAB/Simulink的强大仿真能力和代码生成能力辅助设计&#xff01;在此过程中可以系统了解开发…

【Azure 架构师学习笔记】- Azure Databricks (6) - 配置Unity Catalog

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (5) - Unity Catalog 简介 UC的关键特性 之所以DataBricks要用UC&#xff0c; 很大程度是对安全的管控。从上文可以了解到它的四大特性&#…

C#MQTT编程07--MQTT服务器和客户端(wpf版)

1、前言 上篇完成了winform版的mqtt服务器和客户端&#xff0c;实现了订阅和发布&#xff0c;效果666&#xff0c;长这样 这节要做的wpf版&#xff0c;长这样&#xff0c;效果也是帅BBBB帅&#xff0c;wpf技术是cs程序软件的福音。 wpf的基础知识和案例项目可以看我的另一个专…

汽车科技迎来新纪元!奔驰、宝马、谷歌、亚马逊、高通的下一代布局!

不久的将来&#xff0c;你将能够直接通过汽车支付。为了减少支付服务的复杂性&#xff0c;高通正在与摩根大通合作设计一款车载钱包&#xff0c;简化支付体验。这将使驾驶员能够直接通过汽车支付流媒体内容、电动车充电、停车或得来速餐食物。 下一代智能车会是什么样子&#…

测试 ASP.NET Core 中间件

正常情况下&#xff0c;中间件会在主程序入口统一进行实例化&#xff0c;这样如果想单独测试某一个中间件就很不方便&#xff0c;为了能测试单个中间件&#xff0c;可以使用 TestServer 单独测试。 这样便可以&#xff1a; 实例化只包含需要测试的组件的应用管道。发送自定义请…

202408读书笔记|《半小时漫画红楼梦12》——鲜花着锦,烈火烹油,不是东风压了西风,就是西风压了东风

202408读书笔记|《半小时漫画红楼梦12》——鲜花着锦&#xff0c;烈火烹油&#xff0c;不是东风压了西风&#xff0c;就是西风压了东风 1. 关系图谱绘制2. 摘录3. 人物关系 1. 关系图谱绘制 https://blog.csdn.net/qq_40985985/article/details/127822673https://blog.csdn.ne…

代码随想录二刷 | 二叉树| 删除二叉搜索树中的节点

代码随想录二刷 &#xff5c; 二叉树&#xff5c; 删除二叉搜索树中的节点 题目描述解题思路代码实现 题目描述 450.删除二叉搜索树中的节点 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质…

小蓝的漆房*

题目 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int t sc.nextInt();sc.nextLine();int[] res new int[t];for(int i0;i<t;i) {int ans Integer.MAX_VALUE;int n sc.nextInt();int k…

C语言基础语法跟练 day4

41、牛牛有一个半径为 r 的球&#xff0c;他想知道这个球的体积。 #include <stdio.h> #include<math.h> int main() {float r;scanf("%f",&r);float v (4.0/3)*3.14*pow(r,3);printf("%.2f",v);return 0; } 42、小乐乐比较懒惰&#x…

MySQL运维篇(二)主从复制

一、概述 主从复制是指将主数据库的 DDL 和 DML 操作通过 二进制日志 传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而使得从库和主库的数据保持同步。 MySQL 支持一台主库同时向多台从库进行复制&#xff0c; 从…