虚幻引擎UE5专用服务器游戏开发-12 添加生命与法力属性到属性集

一、添加生命与法力属性

1.添加生命属性:Source/Crunch/Public/GAS/CAttributeSet.h

private:
	UPROPERTY()
	FGameplayAttributeData Health;

FGameplayAttributeData 的定义:

Plugins/Runtime/GameplayAbilities/Source/GameplayAbilities/Public/AttributeSet.h:

USTRUCT(BlueprintType)
struct GAMEPLAYABILITIES_API FGameplayAttributeData
{
	GENERATED_BODY()
	FGameplayAttributeData()
		: BaseValue(0.f)
		, CurrentValue(0.f)
	{}

	FGameplayAttributeData(float DefaultValue)
		: BaseValue(DefaultValue)
		, CurrentValue(DefaultValue)
	{}

	virtual ~FGameplayAttributeData()
	{}

	/** Returns the current value, which includes temporary buffs */
	float GetCurrentValue() const;

	/** Modifies current value, normally only called by ability system or during initialization */
	virtual void SetCurrentValue(float NewValue);

	/** Returns the base value which only includes permanent changes */
	float GetBaseValue() const;

	/** Modifies the permanent base value, normally only called by ability system or during initialization */
	virtual void SetBaseValue(float NewValue);

protected:
	UPROPERTY(BlueprintReadOnly, Category = "Attribute")
	float BaseValue;

	UPROPERTY(BlueprintReadOnly, Category = "Attribute")
	float CurrentValue;
};

FGameplayAttributeData是虚幻引擎GAS(GameplayAbilitySystem)中用于表示游戏属性的核心数据结构。该结构体具有以下关键特性:

双值存储机制:

  • BaseValue:基础值,仅包含永久性修改(如角色初始属性或装备加成)
  • CurrentValue:当前值,包含临时buff/debuff效果

主要功能方法:

  • GetCurrentValue()/SetCurrentValue():获取/设置包含临时效果的当前值
  • GetBaseValue()/SetBaseValue():获取/设置永久性基础值
  • 两个构造函数:支持默认初始化为0或指定默认值

设计特点:

  • 通过UPROPERTY宏实现蓝图可读性
  • 推荐通过GameplayEffects修改属性以实现网络同步和预测回滚
  • 通常定义在AttributeSet类中并由其处理网络同步

实际应用示例:

  • 移动速度属性(MoveSpeed)的实现会使用此结构体
  • 伤害(Damage)和护甲(Armor)等战斗属性也采用相同结构
  • 装备系统可通过修改BaseValue实现永久属性加成

2.生成getter和setter函数,不过,有专门的宏函数:

Plugins/Runtime/GameplayAbilities/Source/GameplayAbilities/Public/AttributeSet.h:


 * To use this in your game you can define something like this, and then add game-specific functions as necessary:
 * 
 *	#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
 *	GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
 *	GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
 *	GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
 *	GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)
 * 
 *	ATTRIBUTE_ACCESSORS(UMyHealthSet, Health)
 */

#define GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
	static FGameplayAttribute Get##PropertyName##Attribute() \
	{ \
		static FProperty* Prop = FindFieldChecked<FProperty>(ClassName::StaticClass(), GET_MEMBER_NAME_CHECKED(ClassName, PropertyName)); \
		return Prop; \
	}

#define GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
	FORCEINLINE float Get##PropertyName() const \
	{ \
		return PropertyName.GetCurrentValue(); \
	}

#define GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
	FORCEINLINE void Set##PropertyName(float NewVal) \
	{ \
		UAbilitySystemComponent* AbilityComp = GetOwningAbilitySystemComponent(); \
		if (ensure(AbilityComp)) \
		{ \
			AbilityComp->SetNumericAttributeBase(Get##PropertyName##Attribute(), NewVal); \
		}; \
	}

#define GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName) \
	FORCEINLINE void Init##PropertyName(float NewVal) \
	{ \
		PropertyName.SetBaseValue(NewVal); \
		PropertyName.SetCurrentValue(NewVal); \
	}

这是Unreal Engine游戏能力系统(GAS)中用于简化属性访问的宏定义系统,主要用于定义和管理游戏属性(如生命值、法力值等)。以下是关键点解析:

ATTRIBUTE_ACCESSORS宏‌:

  • 组合了4个基础功能宏,提供完整的属性访问能力
  • 示例用法:ATTRIBUTE_ACCESSORS(UMyHealthSet, Health)会生成Health属性的全套方法

组成宏的功能‌:

  • GAMEPLAYATTRIBUTE_PROPERTY_GETTER:生成获取属性元数据的静态方法
  • GAMEPLAYATTRIBUTE_VALUE_GETTER:生成获取当前属性值的inline方法
  • GAMEPLAYATTRIBUTE_VALUE_SETTER:生成通过AbilitySystem修改属性值的方法
  • GAMEPLAYATTRIBUTE_VALUE_INITTER:生成初始化属性值的方法

实现特点‌:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值