一、添加生命与法力属性
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:生成初始化属性值的方法
实现特点:

最低0.47元/天 解锁文章
996

被折叠的 条评论
为什么被折叠?



