UI 绑定:属性变化通知
UI(血条、蓝条、Buff 图标)如何低延迟地跟随 GAS 状态?三个要点。
1. 在哪里订阅
AttributeSet 的 PostGameplayEffectExecute 里广播(第 3 章坑一提到过)。这是所有 GE 的公共出口,血量/蓝量变化必经此地:
// AttributeSet
UPROPERTY(BlueprintAssignable, Category="Health")
FOnAttributeChanged OnHealthChanged; // 自定义多播委托(DYNAMIC_MULTICAST)
void UMyAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
{
Super::PostGameplayEffectExecute(Data);
if (Data.EvaluatedData.Attribute == GetHealthAttribute())
OnHealthChanged.Broadcast(GetHealth(), GetMaxHealth());
}
蓝图 UMG 在 BeginPlay 时 Bind Event to OnHealthChanged(通过角色的 ASC 取 AttributeSet)。
2. 效果(Buff/Debuff)图标怎么更新
GE 的"加减"事件,用 ASC 的两个委托:
- OnGameplayEffectAppliedDelegateToSelf(加了 GE);
- OnAnyGameplayEffectRemoved(移除了 GE)。
UI 订阅它们,维护一个"当前生效效果列表",用 GE 的 GrantedTags 决定图标与剩余时间(GetGameplayEffectStartTimeEndTime 等查询接口)。
3. 性能:不要每帧刷新
属性订阅做的是事件驱动刷新,UMG 里不要 Tick。只有以下情况需要定时: - 剩余时间倒计时(用 GE 的开始/结束时间算,自身动画即可,不必 Tick 查 ASC)。
4. 网络下 Mixed 模式的可见性
Replication Mode = Mixed 时:
- 自己客户端:UI 订阅正常(所有属性变化都同步到 Owner);
- 其他客户端:Mixed 会把"游戏性相关"的 GE 同步过去(如血量),所以小怪血条也能显示——但需要正确配置 ReplicationMode(小怪可以 Minimal + 关键属性)。
本章小结
- 属性订阅:AttributeSet 广播变化,UMG 绑定(事件驱动,不用 Tick)。
- Buff/Debuff 列表:订阅 ASC 的 Effect Added/Removed 委托。
- 网络可见性由 Replication Mode 决定,UI 层只管订阅。
