连招系统

Cover.GCS
YuewuDev

作者

YuewuDev

创建时间: 2026年10月12日更新时间: 2026年10月12日

目录

概述

本文说明 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 一致。

调用流程

  1. 在连招 Ability 的蓝图或 C++ 逻辑中,于起手时调用 StartCombo(ComboEvent);在后续攻击窗口调用 AdvanceCombo(ComboEventData)。
  2. AdvanceCombo 会先调用 AllowAdvanceCombo()。默认实现允许推进;可在蓝图中覆盖以关闭当前窗口。StartCombo 不经过这个门控。
  3. 对本地控制的角色,Combo Ability 读取战斗组件中的当前步骤,并从实体接口取得 DataTable。系统遍历表行,找到第一个通过步骤、事件、标签、Ability 存在性、可选激活测试和自定义筛选的行。
  4. 如果旧的子 Ability 仍在运行,系统会先取消它,再尝试激活新子 Ability。激活成功后才更新 ComboStep:通常写入当前步骤加一;符合重置条件的行写入零。激活失败会重置连招。
  5. 当前子 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 一致,以及可选激活测试或蓝图筛选是否拒绝该行。