GameplayEffect

GameplayEffects(简称 GE)是实现角色属性修改、状态变化(如 Buff/Debuff)以及瞬时或持续效果的核心机制。

一、Gameplay Effects 的核心概念

  1. 作用机制

    • GE通过修改角色的AttributeSet(属性集)或附加GameplayTag(游戏标签)来影响目标,例如增减生命值、改变移动速度或施加眩晕状态。
    • Ability(技能)触发,或直接通过代码/蓝图应用。
  2. 关键特性

    • 瞬时效果(Instant):立即生效并消失(如直接伤害)。
    • 持续效果(Duration):在固定时间内生效(如减速Debuff)。
    • 无限效果(Infinite):永久生效,需手动移除(如被动技能)。
    • 周期性触发(Periodic):按间隔重复生效(如每秒回血)。

二、Gameplay Effect 的组成

1.Modifier(修饰符)

  • 定义如何修改属性,支持多种运算方式::
    • Add:叠加值(BaseValue += ModifierValue)。
      示例:攻击力增加 10 点。
    • Multiply:乘法缩放(BaseValue *= ModifierValue)。
      示例:攻击力提升 20%。
    • Divide:除法缩放(BaseValue /= ModifierValue)。
      示例:防御力减少为原来的 1/2。
    • Override:覆盖原值(BaseValue = ModifierValue)。
      示例:强制将血量设置为 100。

2. Magnitude Calculation Type(数值计算类型)

决定修饰符数值(Magnitude)的来源:

类型 说明
Scalable Float 直接使用固定值或根据等级(Level)缩放的值。
Attribute Based 基于目标的属性动态计算(如“伤害 = 攻击力 × 系数”)。
Custom Calculation 通过自定义蓝图或 C++ 逻辑计算数值。
Class (MMC) 使用Modifier Magnitude Calculation 类(继承自 UGameplayModMagnitude)动态计算。
Set by Caller 在运行时通过GameplayEffectSpec 动态设置数值(如技能等级影响伤害)。

3.Duration Policy(持续时间策略)

定义效果的持续时间类型:

策略 说明
Instant 立即生效并结束(无持续,如一次性伤害)。
Has Duration 持续一段时间后结束(如中毒效果持续 10 秒)。
Infinite 永久持续,需手动移除(如 Buff 效果)。

4.Periodic Gameplay Effects(周期性效果)

image-20250309194614486

DurationInfinite 效果可以被设置为周期性触发,值得注意的是,Instant 效果会永久性改变 Base Value,而 DurationInfinite 效果则是改变 Current Value ,将会在效果移除后撤销。周期性触发的效果则会被当作 Instant 效果对待,也会永久性的改变Base Value


4.Stacking(叠加机制)

默认情况下,

GameplayEffects 将应用新的 GameplayEffectSpec 实例,这些实例不知道或不关心之前存在的 GameplayEffectSpec 实例。 GameplayEffects 可以设置为堆叠,而不是添加新的 GameplayEffectSpec 实例,而是改变当前存在的 GameplayEffectSpec 的堆叠计数。堆叠仅适用于 DurationInfinite 类型的GameplayEffects

StackingType

有两种堆叠类型: Aggregate by SourceAggregate by Target.

image-20250313165956963

image-20250313173538447

类型 行为描述
None 不叠加,同一效果多次应用时,各自独立生效
AggregateBySource 目标(Target)上的每个源(Source)ASC 都有一个单独的堆栈实例, 每个源(Source)可以应用堆栈中的X个GameplayEffect
AggregateByTarget 目标(Target)上只有一个堆栈实例而不管源(Source)如何, 每个源(Source)都可以在共享堆栈限制(Shared Stack Limit)内应用堆栈