6. UE5 GAS 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属性

在之前的文章中,我创建了AS的文件,里面没有添加角色属性。
这里我先创建了两个属性,一个是Health,用来表示角色的当前血量,另一个是MaxHealth,代表角色的最大血量。
以下是代码
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);
}

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

验证属性

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

### 虚幻引擎中的GAS(Gameplay Ability System) #### GAS的核心功能 Gameplay Ability System (GAS) 是虚幻引擎的一个内置插件,提供了强大的框架来实现角色技能、属性系统以及状态效果等功能。它支持复杂的数值计算、能力消耗与冷却机制,并集成了网络同步和预测功能[^3]。 #### 插件激活 要在项目中使用 GAS,需先在插件管理器中启用该插件。一旦启用,可以通过 `AbilitySystemComponent` 来管理和执行各种能力和属性操作。 #### 主要组成部分 1. **Abilities(能力)** Abilities 定义了游戏中可触发的行为或动作,例如攻击、施法或其他交互行为。它们通常绑定到特定输入事件并具有自己的逻辑脚本。每个 Ability 可以设置资源成本(如生命值或能量)、持续时间及冷却周期。 2. **Attributes(属性)** Attributes 表示实体的基础数据项,比如健康度、耐力或者力量等级等。这些动态变化的数据由 `AttributeSet` 类型定义并通过 `AbilitySystemComponent` 进行更新维护。 3. **Effects(效果)** Effects 用于描述当某个条件满足时所发生的变化,可能涉及修改目标单位的一系列参数或是附加特殊标记(Tag)。常见的例子有伤害加成、减速惩罚等等。 4. **Gameplay Tags 和 Gameplay Events** - **Gameplay Tags**: 提供了一种灵活的方式来分类和检索游戏内的元素。几乎所有的核心结构都支持关联标签以便于查询匹配。 - **Gameplay Events**: 允许广播自定义消息给监听者列表从而驱动复杂互动链路的发生发展过程。 5. **Network Replication & Prediction** 鉴于多人在线环境下的需求考量,GAS 设计之初就充分考虑到了跨客户端间一致性保障的重要性,因此包含了完备可靠的网路传输解决方案. #### 示例代码展示如何创建简单的Skill System基于GAS: ```cpp // MyCharacter.h UCLASS() class MYPROJECT_API AMyCharacter : public ACharacter { GENERATED_BODY() public: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components") UAbilitySystemComponent* AbilitySystemComp; protected: virtual void BeginPlay() override; }; // MyCharacter.cpp #include "MyCharacter.h" #include "AbilitySystemBlueprintLibrary.h" AMyCharacter::AMyCharacter(const FObjectInitializer& ObjectInitializer) { AbilitySystemComp = CreateDefaultSubobject<UAbilitySystemComponent>(TEXT("AbilitySystemComp")); } void AMyCharacter::BeginPlay() { Super::BeginPlay(); if(AbilitySystemComp && HasAuthority()) { // Grant abilities on server side only. FGameplayAbilitySpecDef SpecDef; SpecDef.Ability = StaticClass()->FindFunctionByName(FName(TEXT("ExecuteBasicAttack"))); SpecDef.InputID = EInputAction::IA_BasicAttack; // Assuming you have this enum defined elsewhere const TArray<FGameplayEffectContextHandle> ContextHandles; AbilitySystemComp->GiveAbility(SpecDef); // Initialize default attributes here... } } ``` 上述片段展示了怎样在一个继承自ACharacter类的新角色身上添加基本战斗技巧的能力授予方法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值