ARPG GAS 完整执行流程图
February 24, 2025About 7 min
ARPG GAS 完整执行流程图
把 ARPG 战斗里 GAS 的几条主线流程整理成可对照的伪代码 + 流程框图:能力激活、近战伤害、投射物伤害、属性变化驱动状态、GameplayCue 触发、能力授予、死亡/特殊状态、GE 应用。读完这一篇基本就能在调试器里知道下一步该断点打在哪。
1. 能力完整激活流程
阶段 1:输入捕获
阶段 2:输入处理(每帧 Tick)
阶段 3:CanActivateAbility
阶段 4:CommitAbility 与 ApplyCost
阶段 5:能力执行
阶段 6:能力结束
2. 近战攻击(Ring)伤害流程
触发:动画通知
持续追踪(每帧)
伤害应用
目标属性修改
命中反馈
3. 投射物(Flight)伤害流程
触发与对象池分配
飞行阶段
命中
4. 属性变化与状态触发流程
属性修改管道(以 Health 为例)
特殊状态触发(碎甲示例)
摇晃(Stagger)
平衡等级(Poise)
5. GameplayCue 触发流程
方式一:通过 ASC(标准 GAS 流程)
方式二:通过 GameplayCueManageComponent(推荐)
GCN 类型与生命周期
伤害类型标签解析
6. 能力授予与初始化
方式一:通过 AbilitySet(推荐)
方式二:动态授予
授予回调
Avatar 设置时的回调
7. 死亡与特殊状态流程
玩家死亡
肢解(Dismember)
EvaluatedGameplayTag 状态评估
8. GE 应用完整流程
创建 Spec
// 方式一:从 Ability(推荐,自动继承 Ability 标签)
FGameplayEffectSpecHandle Spec =
Ability->MakeOutgoingGameplayEffectSpec(GEClass, Level);
// 方式二:从 ASC
FGameplayEffectSpecHandle Spec =
ASC->MakeOutgoingSpec(GEClass, Level, ASC->MakeEffectContext());
填充附加信息
// 战斗记录
auto* Ctx = FGameplayEffectContextProject::ExtractEffectContext(Spec.Data->GetContext());
Ctx->FightRecord = FightRecord;
Ctx->RelatedAsset = SpellRingAsset;
// SetByCaller(伤害数值由外部注入)
Spec.Data->SetSetByCallerMagnitude(DamageTag, DamageValue);
// 攻击定义(武器、法术参数)
UCombatPayloadFunctionLibrary::AddAttackDefinitionToGameplayEffectSpec(Spec, AttackAsset);
// 命中结果
UAbilitySystemBlueprintLibrary::EffectContextAddHitResult(
Spec.Data->GetEffectContext(), HitResult, true);
应用
// 应用到目标
SourceASC->BP_ApplyGameplayEffectSpecToTarget(Spec, TargetASC);
// 或应用到自身(成本 GE)
SourceASC->ApplyGameplayEffectToSelf(GEClass, Level, Context);
Duration 类型一览
| 类型 | 行为 | 适用 |
|---|---|---|
| Instant | 修改 BaseValue → 立即结束 | 一次性伤害、回复 |
| Duration | 持续修改 → 时间到自动移除 | 减速、临时 Buff |
| Infinite | 必须手动移除 | 装备 Buff、被动状态 |
| Period | 周期触发 Instant 效果 | 持续中毒、持续回血 |
调试时,按这条主线找断点:
- 输入没生效 →
ProcessAbilityInput - 激活失败 →
CanActivateAbility、ApplyAbilityBlockAndCancelTags - 伤害不进 →
RingOnHit→MakeOutgoingGameplayEffectSpec→BP_ApplyGameplayEffectSpecToTarget - 属性没变 →
PostGameplayEffectExecute(MetaDelta 是否归零、状态是否触发) - 没特效 →
ExecuteGameplayCueOnOwner(CueTag 是否注册、GCN 是否被发现)