GAS 属性集创建笔记

GAS 属性集创建笔记

一、创建单个属性需要的步骤

步骤 1:在头文件中声明属性

UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Health, Category = "属性")
FGameplayAttributeData Health;

做了什么:声明了一个名为 Health 的属性,类型是 FGameplayAttributeData(GAS 专用的可复制数据结构)。

说明符含义

BlueprintReadOnly:蓝图中只能读取,不能修改

ReplicatedUsing = OnRep_Health启用网络复制,当客户端收到同步数据时自动调用 OnRep_Health 函数

Category = "属性":在编辑器细节面板中的分组名称


步骤 2:声明网络同步回调函数

UFUNCTION()
void OnRep_Health(const FGameplayAttributeData& OldHealth) const;

作用:当客户端从服务器收到 Health 的新值时,这个函数会被自动调用。

参数 OldHealth:保存的是变化前的旧值,可以用来比较判断属性是增加还是减少了。


步骤 3:在 cpp 中配置网络复制

void UAuraAttributeSet::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);
    
    DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Health, COND_None, REPNOTIFY_Always);
}

GetLifetimeReplicatedProps 作用

UE 的网络系统调用这个函数来确定哪些属性需要复制、如何复制。你必须重写它并在这里为每个属性调用复制宏。

DOREPLIFETIME_CONDITION_NOTIFY 参数含义

第一个参数:Class(类名)
属性所属的类,比如 UAuraAttributeSet。宏需要知道这个属性定义在哪个类中。

第二个参数:Property(属性名)
要复制的属性名称,比如 Health 或 MaxHealth。

第三个参数:Condition(复制条件)
决定属性在什么情况下会被复制到客户端。
常用的值有:

  • COND_None:始终复制,不管任何条件(属性集最常用)

  • COND_InitialOnly:只在初次复制时发送,之后不再同步

  • COND_OwnerOnly:只复制给这个 Actor 的拥有者

  • COND_SkipOwner:复制给所有客户端,除了拥有者

第四个参数:RepNotifyCondition(通知条件)
决定当属性在客户端收到复制数据时,是否触发 RepNotify 回调函数(也就是 OnRep_XXX 函数)。
常用的值有:

  • REPNOTIFY_Always:只要收到复制数据就触发回调

  • REPNOTIFY_OnChanged:只有值真正发生变化时才触发回调


步骤 4:实现回调函数

void UAuraAttributeSet::OnRep_Health(const FGameplayAttributeData& OldHealth) const
{
    GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, Health, OldHealth);
}

GAMEPLAYATTRIBUTE_REPNOTIFY 宏的作用

  1. 比较当前值和新值是否有变化

  2. 如果有变化,触发 GAS 的属性变化委托

  3. 让绑定了这个属性的 UI 或技能效果能够正确响应


二、一个属性需要的四要素

第一要素:使用 FGameplayAttributeData 类型

属性不能用普通的 float 或 int,必须使用 FGameplayAttributeData 作为数据类型。

示例:

UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Health)  
FGameplayAttributeData Health;

这个类型是 GAS 专门为属性设计的容器,内部封装了网络复制和变化委托的机制。


第二要素:添加 ReplicatedUsing 说明符

在 UPROPERTY 中必须指定 ReplicatedUsing,并告诉它哪个函数负责处理客户端接收数据后的回调。

示例:

ReplicatedUsing = OnRep_Health

这个说明符告诉 UE:这个属性需要网络复制,当客户端收到新值时自动调用 OnRep_Health 函数。


第三要素:在 GetLifetimeReplicatedProps 中配置复制宏

必须重写 GetLifetimeReplicatedProps 函数,并在函数内为每个属性调用 DOREPLIFETIME_CONDITION_NOTIFY 宏。

示例:

DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Health, COND_None, REPNOTIFY_Always)

这个宏告诉 UE 网络系统:这个属性应该何时复制、复制后是否触发回调。


第四要素:实现 OnRep 回调函数并在内部调用 GAMEPLAYATTRIBUTE_REPNOTIFY

必须实现你在 ReplicatedUsing 中指定的回调函数,并且函数内部要调用 GAMEPLAYATTRIBUTE_REPNOTIFY 宏。

示例:

void UAuraAttributeSet::OnRep_Health(const FGameplayAttributeData& OldHealth) const  
{  
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, Health, OldHealth);  
}

这个宏负责比较新旧值是否有变化,如果有变化就触发 GAS 的属性变化委托,让绑定了这个属性的 UI 或技能能够正确响应。

posted @ 2026-06-15 16:05  Yokino123  阅读(24)  评论(0)    收藏  举报