#define ATTRIBUTE_ACCESSORS(ClassName,PropertyName) \
GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName,PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)
UCLASS()
class MYPROJECT_API UMyAttributeSet : public UAttributeSet
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly,ReplicatedUsing=OnRep_Health)
FGameplayAttributeData Health;
UFUNCTION()
void OnRep_Health(FGameplayAttributeData& OldValue);
ATTRIBUTE_ACCESSORS(ThisClass,Health);
};
原因:
-
GAMEPLAYATTRIBUTE_PROPERTY_GETTER 的特殊性:
- 与其他三个宏(Getter/Setter/Initter)不同,
PROPERTY_GETTER 必须同时接收 类名 和 属性名 两个参数。
- 它需要这两个参数来生成类似
FindFieldChecked<ClassName::PropertyName> 的代码,以便在反射系统中定位该属性。
- 你当前的代码只传了
PropertyName,导致引擎试图把变量名 Health 当作类型名去查找,从而报错“不能用作类型”。
-
其他宏的特性:
VALUE_GETTER, VALUE_SETTER, VALUE_INITTER 只需要属性名,因为它们生成的是成员函数,可以直接访问当前类的成员变量。