GameplayEffect
GameplayEffects(简称 GE)是实现角色属性修改、状态变化(如 Buff/Debuff)以及瞬时或持续效果的核心机制。
一、Gameplay Effects 的核心概念
-
作用机制:
- GE通过修改角色的
AttributeSet
(属性集)或附加GameplayTag
(游戏标签)来影响目标,例如增减生命值、改变移动速度或施加眩晕状态。 - 由
Ability
(技能)触发,或直接通过代码/蓝图应用。
- GE通过修改角色的
-
关键特性:
- 瞬时效果(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。
- Add:叠加值(
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(周期性效果)
Duration 和 Infinite 效果可以被设置为周期性触发,值得注意的是,Instant 效果会永久性改变 Base Value
,而 Duration 和 Infinite 效果则是改变 Current Value
,将会在效果移除后撤销。周期性触发的效果则会被当作 Instant 效果对待,也会永久性的改变Base Value
。
4.Stacking(叠加机制)
默认情况下,
GameplayEffects
将应用新的 GameplayEffectSpec
实例,这些实例不知道或不关心之前存在的 GameplayEffectSpec
实例。 GameplayEffects
可以设置为堆叠,而不是添加新的 GameplayEffectSpec
实例,而是改变当前存在的 GameplayEffectSpec
的堆叠计数。堆叠仅适用于 Duration
和 Infinite
类型的GameplayEffects
。
StackingType
有两种堆叠类型: Aggregate by Source
和 Aggregate by Target
.
类型 | 行为描述 |
---|---|
None | 不叠加,同一效果多次应用时,各自独立生效 |
AggregateBySource | 目标(Target)上的每个源(Source)ASC 都有一个单独的堆栈实例, 每个源(Source)可以应用堆栈中的X个GameplayEffect |
AggregateByTarget | 目标(Target)上只有一个堆栈实例而不管源(Source)如何, 每个源(Source)都可以在共享堆栈限制(Shared Stack Limit)内应用堆栈 |