Wiki
858 words
4 minutes
GameplayEffect (GE)
GameplayEffect (GE)
GameplayEffect 是 GAS 中负责“声明效果”的资产类型。
它本身不写技能流程,而是描述:
- 要修改哪些属性
- 修改值如何计算
- 持续时间和周期
- 是否授予或移除
GameplayTag - 堆叠、免疫、应用条件等规则
和 GameplayAbility 的区别
- GameplayAbility:决定什么时候触发、由谁触发、触发时做什么
GameplayEffect:决定生效后具体改什么、持续多久、如何叠加
一个常见组合是:
GameplayAbility被输入或事件激活- 能力内部创建
GameplayEffectSpec - 通过 ASC 把效果应用到自己或目标
运行时形态
编辑器里配置的是 UGameplayEffect 类定义,真正运行时参与计算的是 GameplayEffectSpec。
Spec 会把下面这些信息组合到一起:
- GE 类本身的静态配置
- 等级
- EffectContext
- 动态设置的 SetByCaller 数值
- 捕获到的属性和标签
GameplayEffect 常见关注点
Duration Policy
Instant:立刻结算,常用于瞬时伤害或治疗Duration:持续一段时间Infinite:常驻,直到被显式移除
Modifiers
用于声明属性如何变化,数值来源可能是:
- 固定值
SetByCaller- MMC
- Execution Calculation
Tags
GE 经常配合标签来做状态控制,例如:
- 施加
Debuff.Stun - 阻止某些能力激活
- 作为免疫或触发条件
继续阅读
- GameplayEffectSpec
- ApplyGamePlayEffectToSelf
- MMC
- Execution Calculation
- 添加/移除标签 (
AddGameplayTag,RemoveGameplayTag)。 - 【技巧】监听标签变化 (
RegisterGameplayTagEvent):当特定标签被添加或移除时触发回调。这对于状态机或触发器非常有用。 - 检查标签存在性 (
HasMatchingGameplayTag,HasAllMatchingGameplayTags,HasAnyMatchingGameplayTags)。
- 添加/移除标签 (
-
能力任务 (Ability Tasks)
- 【注意】ASC 负责管理由 GameplayAbility 创建的 AbilityTask 实例的生命周期。
-
网络同步 (Replication)
- 【重点】ASC 内置了对属性、标签和效果激活的网络复制支持。需要正确设置 Actor 和 Component 的复制策略。
- 支持 预测 (Prediction),以减少网络延迟带来的影响。
如何获取 ASC
通常有几种方式获取目标 Actor 的 ASC:
- 直接附加: 如果 ASC 直接附加在 Actor 上(如 Character),可以直接获取:
UAbilitySystemComponent* ASC = GetAbilitySystemComponent(); // AActor 类的方法// orUAbilitySystemComponent* ASC = FindComponentByClass<UAbilitySystemComponent>();
- 通过接口: 实现
IAbilitySystemInterface接口,通常在 Character 或 PlayerState 中实现GetAbilitySystemComponent()方法。这是推荐的方式,因为它提供了统一的访问点。// 在实现了接口的类内部virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override { return AbilitySystemComponent; }// 从其他地方获取IAbilitySystemInterface* ASI = Cast<IAbilitySystemInterface>(TargetActor);if (ASI){UAbilitySystemComponent* ASC = ASI->GetAbilitySystemComponent();} - 通过 PlayerState: 在多人游戏中,ASC 常常放在
PlayerState上,因为它在客户端和服务端都存在且与玩家生命周期绑定。APlayerState* PS = GetPlayerState();if (PS){IAbilitySystemInterface* ASI = Cast<IAbilitySystemInterface>(PS);if (ASI){UAbilitySystemComponent* ASC = ASI->GetAbilitySystemComponent();}}
重要概念链接
- AttributeSet:属性集的具体实现。
- GameplayAbility:定义能力的蓝图或 C++ 类。
- GameplayEffect:定义属性修改或状态效果的蓝图或 C++ 类。
- Gameplay Tags:用于状态管理和逻辑判断的标签系统。
- 预测:处理网络延迟的技术。
- AbilityTask:能力中执行异步操作的节点。
- MetaAttributes
常见问题与注意点
- 【注意】确保 ASC 和相关的
AttributeSet被正确初始化和注册。 - 【注意】在多人游戏中,理解 ASC 的所有权(通常是服务器)和复制策略至关重要。客户端不能直接修改服务器上的属性或随意激活能力(除非使用预测)。
- 【技巧】利用
GameplayEffectContext传递额外信息(如伤害来源、暴击标记)。见 EffectContext。
GameplayEffect (GE)
https://fuwari.vercel.app/wiki/unreal/gas/gameplayeffect/