基于 UE5 + GAS 的开源技能编辑器:调研、命名与仓库方案¶
调研对象:① 商业 UE 插件 Able(本地
.../Gameplay/Able、AbleDebugger);② 开源 AbilityKit(github.com/HOBOBO/AbilityKit) 目标:两者取优 + 原生 GAS + 不重复造轮子 + 规避 Able 版权风险
0. 一句话结论¶
AbilityKit 是 Unity / 纯 C# 项目,不是 UE 插件——它的代码一行都不能直接搬,值得学的是它的分层架构与机制设计(Pipeline / Triggering / Trace / Continuous / 配置可回导)。
Able 是 UE 商业插件(Extra Life Studios,Marketplace 销售)——值得学的是它的编辑器 UX 与时间轴 Task 模型,且它不使用 GAS(只用 FGameplayTagContainer),网络同步很弱。
因此我们的定位是明确的空白地带:
UE5 原生 + GAS 一等公民 + 可 diff 的数据资产 + 时间轴可视化编排 + 运行时可调试 即:用 Able 的编辑器体验,承载 AbilityKit 的架构思想,跑在 GAS 之上。
1. Able 调研(UE 商业插件)¶
1.1 核心数据模型¶
| 概念 | 说明 | 证据 |
|---|---|---|
UAblAbility |
一条"时间轴技能"资产(Blueprintable):Length / Cooldown / PlayRate / IsBullet、被动与堆叠(MaxStacks、Refresh 策略)、Loop(起止+最大迭代)、m_Tasks[] + UID、依赖缓存、Realm、ECA 模块数组、仅编辑器的预览角色/武器/子弹/缩略图字段 |
AbleCore/Classes/ablAbility.h:434-524,预览字段 392-449 |
UAblAbilityTask |
EditInlineNew、无状态。契约:CanStart / OnTaskStart / OnTaskTick / IsDone / OnTaskEnd,另有 NeedsTick、IsSingleFrame、IsAsyncFriendly、GetTaskRealm(Client/Server/Both)、依赖表、CreateScratchPad(状态外置)、GetStatId、OnAbilityTimeSet(编辑器拖时间轴回调) |
AbleCore/Classes/Tasks/IAblAbilityTask.h:93-150 |
| 时间驱动 | 纯秒级:CanStart = 当前时间 ≥ StartTime,IsDone = 当前时间 ≥ EndTime;帧只在编辑器 UI 层做对齐 |
AbleCore/Private/Tasks/IAblAbilityTask.cpp:47-50, 72-75 |
| 目标 / 碰撞 | EAblAbilityTargetType(Self/Owner/Instigator/TargetActor/Camera);碰撞查询 FAblQueryResult,支持 FTraceHandle 异步 |
ablAbilityContext.h:18-68 |
| 分支 | UAblBranchTask + UAblBranchCondition(OnInput/Always/Custom,可 Negate) |
Tasks/ablBranchTask.h:86-107 |
1.2 运行链路¶
Ability(配置) → Context(单次运行数据:Owner/Instigator/Targets/Stack/Time/ScratchPad/异步句柄) → Instance(执行器,不复制 Task,只存 Sync/Async 活动列表,Fire&Forget) → Component(驱动器)
UAblAbilityComponent(UActorComponent + IGameplayTagAssetInterface,TG_DuringPhysics)单 Tick 串行驱动:冷却 → Pending/Branch 队列 → 异步目标查询回收 →InternalUpdateAbility(DeltaTime * PlayRate)→ 被动 → 权威端复制。AbleCore/Private/ablAbilityComponent.cpp:43-188- 所谓 "Async" 只是把冷却/实例更新丢到 TaskGraph,目标线程仍是 GameThread,不是真正并行(
ablAbilityUtilities.h:16-56)。 - 网络只同步"当前激活 Ability + 被动列表"(按 AbilityNameHash 匹配)。
1.3 编辑器组成(最值得借鉴的部分)¶
布局(ablAbilityEditorModes.cpp:28-83):工具栏 / 左侧 Ability 属性 / 右上视口 + 右下时间轴 / 右侧 Task 详情 / Editor Settings,Graph、Timeline 双模式。
| 能力 | 实现 | 借鉴价值 |
|---|---|---|
| 自绘时间轴与轨道(拖首尾、整体拖动、网格) | SAbilityTimeline.h:16-90、SAbilityTimelineTrack.h:14-136 |
★★★ 核心 |
| 预览视口 + 缩略图抓取 | SAbilityViewport.h、AblAbilityThumbnailRenderer.h |
★★★ |
| 预览角色/武器 + 动画选择器(可一键按动画长度裁剪技能) | ablAbilityEditor.h:159-195、SAbilityAnimationSelector.h |
★★★ |
| Task Picker(树形分类 + 搜索 + 支持 BP Task) | SAbilityTaskPicker.h:54-131 |
★★★ |
| 验证器(按 Task 类绑定、TaskGraph 并行、Log/Warning/Error 分级) | AblAbilityTaskValidator.h:99-160 |
★★★ |
| Json/Binary 导入导出(按 Gameplay/Effect/Sound × Realm 分文件、可加密) | AblJsonSerializer.h:36-116 |
★★★ |
| Task/ECA 复制粘贴、Git 提交 Json | ablAbilityEditor.h:109-115, 257-279 |
★★ |
| 单帧步进、播放/暂停、吸附/网格/字体 Settings | ablAbilityEditor.h:171、ablSettings.h:46-71 |
★★ |
对外扩展点 FAbleEditorEventManager |
AbleEditorEventManager.h:11-68 |
★★ |
| ECA 机制(Event/Condition 单槽 + ActionTrue/False/Both 三组 Task,可整体启停/折叠/着色/拷贝/缩放时间) | ablAbilityECAModule.h:14-197 |
★★★ 相当于"轨道内子图 + 语义分支" |
AbleDebugger:编辑器内运行时可视化(非网络协议)。控制台 Able.Debug ENABLE/DISABLE/SUMMARY/HELP,单例 UAbleDebuggerEnterpoint(FTickableEditorObject) 每帧刷新,UMG 列表 + 世界内 Billboard 显示当前 Ability/Task/ECA 活跃状态。
1.4 与 GAS 的关系(关键结论)¶
Able 核心完全不用 GAS,只用了 FGameplayTagContainer / IGameplayTagAssetInterface;冷却、堆叠、被动、打断全部自建。
GAS 桥接发生在项目层(你仓库里的 MoeAblAbility / MoeAblAbilityTask / AblPlayAbilityMontageTask 持 UAbilitySystemComponent + Montage + GameplayCue;攻击检测用 FCollisionShape + Tag 过滤)。
1.5 Able 的短板(= 我们的机会)¶
- 非 GAS 原生 → 属性、GE、预测、Cue、Tag 无内在关联,每个项目都要写一遍桥接层。
- 网络只同步"当前技能指针",无预测/回滚,Task 级结果不复制。
- uasset 二进制不可 diff → 被迫外置 Json + Git 双轨,维护成本高。
- 时间按秒存储、帧只在 UI 对齐 → 难以做确定性/帧锁定。
- 蓝图/Lua 依赖重(
IAblAbilityTask.h:253-268有 Lua 开关),缺纯 C++ 数据资产路径,性能与调试受限。 - OrderValue / UID / 依赖表 / Realm 多套体系并存,概念冗余。
- 通用 Task 层已被项目代码侵蚀(Cue/GE/Projectile/攻击检测/Lua 全部下沉到项目模块),复用性差。
2. AbilityKit 调研(Unity / 纯 C#,MIT,278 stars)¶
2.1 它是什么¶
面向中大型战斗项目的可组合工具集(不是单一产品包):以 Unity UPM 包组织,核心战斗逻辑是纯 C#,可脱离 Unity 跑在服务器、控制台、测试环境;Unity 侧只承担入口、创作工具与表现投影。MIT 协议。
2.2 三层边界(最值得抄的思想)¶
宿主层(Unity Root / Console / ET / Orleans)
↓
项目策略层(组合根、配置规范、系统顺序、权威模型、表现投影) ← 框架不决定
↓
工具集机制层(Core / Pipeline / Triggering / Combat / World / Sync / Network / Tooling)
框架只稳定"机制",不强行抽象一套所有游戏都要实现的 BattleApplication。
2.3 可直接映射到 UE 的机制¶
| AbilityKit 模块 | 职责 | 我们在 UE/GAS 里的对应 |
|---|---|---|
pipeline |
Phase 图编排:Sequence/Parallel/Conditional/Repeat/Delay/WaitUntil/Timeline、暂停/中断/Trace | 时间轴轨道 + 复合轨道(UE 侧可用 Task 组合实现,不必另建 Phase 图) |
triggering |
EventBus + TriggerRunner(phase→priority→order)+ 条件(Payload/Blackboard/NumericExpr)+ 强类型 Action Schema + ExecutionControl | ECA 轨道 + Trigger 规则系统(对标 Able 的 ECA,但用强类型 Action) |
actionschema |
Action/Timeline 的强类型 DTO,配置 → 运行时 | USTRUCT + Instanced UObject Task,参数强类型、可反射序列化 |
trace |
溯源树:root/parent/owner context,技能→投射物→区域→Buff→伤害血缘 | 轻量 UAKTrace,供调试/伤害归因/回放 |
continuous |
持续效果的条件化激活/阻止/暂停/恢复/移除 | 直接用 UGameplayEffect(Infinite/Duration)+ Tag 规则,不自建 |
modifiers |
参数修正器(Buff/装备/天赋改写技能参数) | 直接用 GE 的 Modifier / SetByCaller,不自建 |
gameplaytags / attributes |
标签与属性 | 直接用 FGameplayTag / UAttributeSet,不自建 |
ability.explain / diagnostics |
解释树、Profiler、结构化证据导出 | 调试面板 + Trace 导出(对标 AbleDebugger) |
world.* / network.* / framesync / statesync / record |
帧同步、快照、状态同步、预测回滚 | 不自建——GAS 自带预测 + ASC 复制 + FPredictionKey;DS 场景用 UE 网络 |
analyzer (Roslyn) |
静态分析与项目约束检查 | 编辑器 Validator + 命令行 CI 校验(对标 Able Validator) |
2.4 不能照搬的部分¶
- 它是 C#/Unity,
world.ecs / entitas / svelto / Orleans / Luban与 UE 无关。 - 它的同步体系(帧同步/回滚)在 UE 里应让位给 GAS + UE 网络,否则就是重复造轮子。
- 它的
combat.motion / navigation / collision在 UE 里直接用UCharacterMovementComponent、UNavigationSystemV1、物理查询即可。
3. 两者取优:设计取舍表¶
| 维度 | 采用 Able 的 | 采用 AbilityKit 的 | 交给 GAS / UE 原生(不造轮子) |
|---|---|---|---|
| 资产形态 | 时间轴 + 轨道 UX、预览视口 | 强类型 Action Schema、配置可回导 | UDataAsset(可文本化导出,可 diff) |
| Task 模型 | EditInlineNew 无状态 Task + ScratchPad |
注册中心 + 强类型参数 + 可验证 | UObject 派生(C++ 为主,允许 BP 扩展) |
| 分支 | ECA 轨道分组(Event/Condition/Action) | Triggering(事件→条件→动作→执行控制) | Tag / GE 条件复用 |
| 属性 / Buff / 修正 | — | 机制思想 | UAttributeSet + UGameplayEffect + Modifier |
| 表现解耦 | Montage / 特效直接播 | Cue 回调 | UGameplayCueNotify(GAS 原生) |
| 冷却 / 消耗 / 堆叠 | 自建(弃) | 自建(弃) | GE Cooldown / Cost / Stacking |
| 网络同步 | 只同步指针(弃) | 帧同步/回滚(暂缓) | ASC 复制 + PredictionKey + GE 复制 |
| 时间 | 秒 + 编辑器帧对齐 | 定点/确定性 | 秒为主,保留"帧锁定模式"开关 |
| 目标选择 | TargetType + 查询 | Targeting 框架(候选/筛选/评分/选择) | UAbilityTask_WaitTargetData + 自定义 FGameplayAbilityTargetDataHandle |
| 校验 | Validator(并行、分级) | Analyzer + 自动化测试 | 编辑器 Validator + 命令行 CI |
| 调试 | AbleDebugger(UMG + Billboard) | explain / diagnostics / Trace | 运行时 Debugger + Trace 导出 |
| 序列化 | Json/Binary 导入导出 | 可读配置 ↔ 运行时双向 | Json + .uasset 双写,Json 进 Git |
核心差异化一句话:别人要么"编辑器好用但不基于 GAS"(Able),要么"架构严谨但不是 UE"(AbilityKit)——我们做UE 原生 GAS + 时间轴可视化 + 数据可 diff + 运行时可溯源的那一档。
4. 命名提案¶
命名约束(按优先级重排)¶
- 一眼可知:看到仓库名就知道是 UE 的技能编辑器(用户核心诉求)
- 不与 Able / AbilityKit / GAS 官方术语撞名(规避版权与 SEO 混淆)
- GitHub / 中文社区可搜索,尽量无撞车
- 能生成干净好记的 C++ 前缀(UE 模块必需)
候选(直白型优先)¶
| # | 名称 | 中文称呼 | 一眼可知 | 品牌感 | 风险 | 备注 |
|---|---|---|---|---|---|---|
| 1 ⭐ | UEAbilityKit |
UE 技能工具箱 / UE 技能编辑器 | ★★★★★ | ★★★ | 低 | UE + Ability + Kit 三要素齐备;"Kit" 能装下 runtime + editor + debugger 整套 |
| 2 | UEAbilityEditor |
UE 技能编辑器 | ★★★★★ | ★★ | 低 | 更精准指向"编辑器",但未来装 runtime 框架时略窄 |
| 3 | UEAbilityStudio |
UE 技能工作台 | ★★★★☆ | ★★★ | 低 | 产品感强,"编辑器"意图略弱 |
| 4 | UESkillEditor |
UE 技能编辑器 | ★★★★★ | ★★ | 低 | 中文最直觉,但与 UE 官方术语 Ability 不一致,海外传播吃亏 |
| 5 | Baton(早期方案) |
指挥棒 | ★☆☆☆☆ | ★★★★★ | 低 | 品牌最好,但看不出是 UE 技能编辑器 |
| ⚠️ | UnrealAbilityKit(全拼) |
虚幻技能工具箱 | ★★★★★ | ★★★ | 中 | "Unreal®" 是 Epic 注册商标;且与 HOBOBO/AbilityKit(Unity)易混淆 |
商标与撞名核查(针对 "Unreal Ability Kit")¶
| 检查项 | 结论 |
|---|---|
| GitHub 撞名 | 检索 UnrealAbilityKit / UEAbilityKit / Unreal Ability Kit 未发现已存在的同类 UE 插件仓库(落地前建议在 GitHub 再确认一次组织名与仓库名可用性) |
| Epic 商标 | "Unreal®" 是 Epic Games 注册商标。把自己的产品命名为 "Unreal XXX" 有"暗示官方出品/背书"的风险;Epic 的商标许可针对 Logo 与品牌素材审批,社区通行的低风险做法是 nominative use:用 UE / UE5 缩写,或写成 "XXX for Unreal Engine"。另外不得使用 Epic Logo、官方字体与配色 |
| 与 AbilityKit 混淆 | HOBOBO/AbilityKit 是 Unity / 纯 C# 项目。直接叫 "Unreal Ability Kit" 极易被理解为它的 UE 移植版或姊妹项目,带来归属与认知问题;加 UE 前缀 + NOTICE 声明"独立实现、仅参考公开设计思想、无代码复用"可基本规避 |
推荐:UEAbilityKit(简称 UAK)¶
- 保留了你要的"Ability Kit"品牌感,同时用
UE前缀压掉商标风险、并和 Unity 版 AbilityKit 明确区分。 - 一眼可知:UE + Ability + Kit,中文传播语就写 "UE 技能编辑器",把"编辑器"这个核心卖点锚在副标题上。
- 语义容量更大:
Kit能装下 runtime(资产 + 执行器 + GAS 桥接 + Trace)、editor(时间轴)、debugger 三块;叫Editor则未来扩展运行时框架时名字会变窄。 - 不与 Able 混淆:与
Able无字面相似。
若你更想强调"这就是个编辑器"而非"工具集",用
UEAbilityEditor(简称 UAE)——它与 GAS 的UGameplayAbility术语也更贴。
命名落地(以 UEAbilityKit 为例)¶
| 项 | 值 |
|---|---|
| 仓库名 | UEAbilityKit(GitHub) |
| 展示名 / 简称 | UAK |
| 中文名 | UE 技能编辑器(传播语) / UE 技能工具箱(全称) |
| README 首行 | UAK — UE5 技能编辑器:基于 GAS 的数据驱动技能编排工具集 |
| uplugin / 插件目录 | UEAbilityKit(Plugins/UEAbilityKit/) |
| 运行时模块 | UEAbilityKit(UEABILITYKIT_API)—— UE 惯例:runtime 模块与插件同名 |
| 编辑器模块 | UEAbilityKitEditor(UEABILITYKITEDITOR_API) |
| 调试模块 | UEAbilityKitDebugger(可选,或并入 Editor) |
| C++ 类前缀 | AK(U + AKAbilityAsset = UAKAbilityAsset):UAKAbilityAsset、UAKAbilityTask、UAKGameplayAbility、FAKContext、UAKTrace |
| 目录 | Plugins/UEAbilityKit/Source/UEAbilityKit/... |
命名取舍说明:仓库/插件名要"一眼可知"所以直白;C++ 前缀用
AK保持类名短、避免UUAK...双字母丑名且不撞引擎符号,二者不要求字面一致,这是 UE 项目的常见做法。 合规提醒:README 与NOTICE中写明「Unreal® 是 Epic Games, Inc. 的商标;本项目为社区独立项目,非 Epic 官方产品」,不使用 Epic 官方 Logo/字体。
5. 仓库与插件骨架建议¶
UEAbilityKit/ # 仓库根(GitHub 仓库名同为 UEAbilityKit)
├─ README.md # 首行:UAK — UE5 技能编辑器(基于 GAS)
├─ LICENSE # 建议 Apache-2.0(含专利声明);要最大传播用 MIT
├─ .gitignore / .gitattributes # *.uasset 走 LFS;Json 走文本
├─ NOTICE # 声明:设计参考 AbilityKit(MIT) 与 Able 的公开交互模式,无代码复用
├─ docs/
│ ├─ research/ # 本次调研(Able / AbilityKit)
│ ├─ design/ # canonical 设计:资产模型、Task 契约、时间模型、Trace、同步
│ └─ roadmap.md
├─ Plugins/UEAbilityKit/
│ ├─ UEAbilityKit.uplugin
│ ├─ Resources/ Content/
│ └─ Source/
│ ├─ UEAbilityKit/ # Runtime(不依赖 Editor)
│ │ ├─ Assets/ # UAKAbilityAsset / UAKAbilitySet
│ │ ├─ Task/ # UAKAbilityTaskBase + 内置 Task(Montage/GE/Cue/Collision/Motion/Branch/Trigger)
│ │ ├─ Track/ # 轨道与复合轨道(Sequence/Parallel/ECA)
│ │ ├─ Exec/ # UAKAbilityInstance / UAKContext / ScratchPad
│ │ ├─ Gas/ # UAKGameplayAbility(UGameplayAbility 桥接)/ TargetData / ASC 扩展
│ │ ├─ Trace/ # UAKTrace 溯源
│ │ └─ Serialize/ # Json 导入导出
│ ├─ UEAbilityKitEditor/ # Editor(时间轴、视口、Picker、Validator、缩略图)
│ └─ UEAbilityKitTests/ # 自动化(可选)
└─ tools/ # CI 校验脚本
UEAbilityKit.uplugin 依赖建议:GameplayAbilities、GameplayTags、GameplayTasks、EnhancedInput(可选)、Slate/SlateCore/UnrealEd(Editor 模块)。
6. 版权规避要点¶
- 不阅读/复制 Able 源码到新库:只保留"公开可观察的交互模式"(时间轴 UX、验证器、预览视口等通用做法)。
- 不使用
abl/Abl前缀,不使用 Able 的Content/*.uasset、*.png资源与文档文案。 - 不与 Able 的 Task 类同名同结构(重新设计 Task 契约,例如把
CanStart/IsDone改为显式的Execute/Tick+ 时间区间数据)。 - AbilityKit 是 MIT,可合法参考其设计文档与思想;在
NOTICE中署名致谢即可(它代码是 C#,本身也不会被复制)。 - 建议 Apache-2.0(比 MIT 多专利条款,适合被商业项目采用);若目标是最大传播则用 MIT。
7. 里程碑建议¶
| 阶段 | 目标 | 产出 |
|---|---|---|
| M0 | 仓库 + 插件骨架 + 最小资产模型 | UEAbilityKit.uplugin、UAKAbilityAsset、空时间轴编辑器 |
| M1 | 运行时执行器 + GAS 桥接 | UAKGameplayAbility 驱动资产;GE / Cue / Tag 三类 Task |
| M2 | 编辑器可用 | 轨道拖拽、预览视口、Montage 对齐、单帧步进 |
| M3 | 治理能力 | Validator、Json 导入导出(进 Git)、CI 校验 |
| M4 | 调试闭环 | Runtime Debugger(对标 AbleDebugger)+ Trace 导出 |
| M5 | 高级编排 | ECA/Trigger 轨道、分支、复合轨道、目标选择与碰撞 Task |
8. 需要你确认的 3 件事¶
- 名字:定
UEAbilityKit(简称 UAK),还是UEAbilityEditor(UAE)/UnrealAbilityKit(全拼,商标风险中)? - UE 版本:仓库基础版本(5.3 / 5.4 / 5.5)?我看到本地工程指向内部引擎分支
ue4_tracking_rdcsp,插件里声明了OpenHarmony平台,需要你给一个对外开源的目标版本。 - License:Apache-2.0(推荐)还是 MIT?
确认后我可以一次性落地:README / LICENSE / NOTICE / UEAbilityKit.uplugin / 三个模块的 Build.cs + 最小类骨架(UAKAbilityAsset、UAKAbilityTaskBase、UAKGameplayAbility)+ .gitignore,直接可编译。