概述
本文说明 Generic Combat System 的数据驱动连招路由:UGCS_ComboAbility 根据传入的 FGameplayEventData,从连招定义数据表中选择并激活下一段 Gameplay Ability。它负责连招步骤与子 Ability 的衔接。
UGCS_ComboAbility 不会自行监听输入或全局 Gameplay Event。输入、动画通知或其他 Ability 逻辑需要显式调用 StartCombo 或 AdvanceCombo。攻击能力与 Ability Action Set 的背景见攻击技能;这套页面描述的是 ComboDefinition 数据表驱动的 Ability 选择。
组成部分
UGCS_ComboAbility:抽象的战斗 Ability,负责挑选定义行、激活对应的子 Ability,并推进或重置连招。FGCS_ComboDefinition:DataTable 行结构,描述某一步可选的 Ability、事件与标签条件、激活测试及扩展数据。UGCS_CombatSystemComponent:保存并复制当前ComboStep,通过OnComboStepChanged和OnComboStepChangedEvent通知步骤变化。IGCS_CombatEntityInterface::GetComboDefinitionTable:战斗实体提供连招定义表的入口。实体实现需要返回本次战斗使用的表;接口返回空时,连招无法选择定义行。接口契约见战斗实体。
UGCS_ComboAbility 会按类和当前 Source Object 在 Ability System Component 中查找表内 Ability。它不会在选择时自动授予子 Ability,因此每个表内 Ability 都必须已经存在于 ASC,且其 Source Object 应与 Combo Ability 查找时使用的 Source Object 一致。
调用流程
- 在连招 Ability 的蓝图或 C++ 逻辑中,于起手时调用
StartCombo(ComboEvent);在后续攻击窗口调用AdvanceCombo(ComboEventData)。 AdvanceCombo会先调用AllowAdvanceCombo()。默认实现允许推进;可在蓝图中覆盖以关闭当前窗口。StartCombo不经过这个门控。- 对本地控制的角色,Combo Ability 读取战斗组件中的当前步骤,并从实体接口取得 DataTable。系统遍历表行,找到第一个通过步骤、事件、标签、Ability 存在性、可选激活测试和自定义筛选的行。
- 如果旧的子 Ability 仍在运行,系统会先取消它,再尝试激活新子 Ability。激活成功后才更新
ComboStep:通常写入当前步骤加一;符合重置条件的行写入零。激活失败会重置连招。 - 当前子 Ability 结束时,如果没有在结束前推进到下一段,连招状态会重置。结束 Combo Ability 本身也会取消仍运行的子 Ability 并重置步骤。
子 Ability 通常不应自行修改 ComboStep;连招推进由 Combo Ability 管理。步骤变化后,战斗组件会调用 OnComboStepChanged(PrevComboStep) 并广播 OnComboStepChangedEvent,包括接收到复制更新时。
配置 DataTable
创建 DataTable 时使用 FGCS_ComboDefinition 行结构。常用字段如下:
AbilityClass:选中后要激活的 Gameplay Ability 类。空类、无法加载的类,或 ASC 中不存在对应 Ability Spec 的行会被跳过。MinComboStep:步骤筛选值。注意当前实现的行为与“最小步骤”这一名称不完全相同:当前步骤为零时,所有非负值都能通过步骤筛选;当前步骤大于零时,值为零的行会被排除。对未设置重置的行,只有当MinComboStep >= 当前步骤时才不会因步骤条件被排除。因此它更像一个非重置行的步骤上限。bResetComboStep:为 true 且MinComboStep > 0时,选中行会把步骤重置到零。重置行不会因MinComboStep < 当前步骤而被排除,但仍不能用MinComboStep = 0作为非起手步骤的候选。EventTag:当传入事件和行都带有效标签时,二者不相等会排除此行;行标签为空时不限制事件。当前实现不会因为传入事件标签为空而拒绝一个带标签的行。EventInstigatorTagQuery:对ComboEventData.InstigatorTags做标签查询。TagQuery:对所属 Ability System Component 当前拥有的 Gameplay Tags 做查询。bRunActivationTest:选行前测试对应 Ability 是否可激活。测试失败时,bAbortIfActivationTestFailed为 true 会终止本次选择;否则只跳过此行。Extension和NativeExtension:供蓝图与 C++ 扩展定义行数据;可在CanSelectedComboDefinition覆盖实现自定义筛选。默认实现不增加额外限制。
当多行同时匹配时,系统使用遍历中遇到的第一行;结构中没有单独的优先级字段。请用互斥的 Event Tag 或标签查询来区分分支,避免依赖 DataTable 行的显示顺序。起手行可将 MinComboStep 设为零;由于其他非零行也可能通过零步骤筛选,仍要用事件或标签条件避免它们抢先匹配。
网络与调试
Combo Ability 使用本地预测策略,并只在本地控制的角色上执行行选择。ComboStep 由战斗组件复制;直接修改会通知权威端或拥有客户端,模拟代理上的直接更新会被忽略。需要响应变化时使用组件的步骤回调或委托。
Gameplay Debugger 会显示当前 ComboStep 和 ComboDefinitionTable。排查无法选招时,先检查实体接口是否返回表、行的步骤与事件/标签条件是否匹配、Ability Spec 是否已授予且 Source Object 一致,以及可选激活测试或蓝图筛选是否拒绝该行。
