跳转至

编辑器设计

设计目标:具备 Able 级别的编辑效率,但结构、布局与功能组合都刻意不同; 并把 AbilityKit 的"可解释 / 溯源"思想变成编辑器的一等视图。

法律基线:时间轴、轨道、拖拽、缩放、吸附、验证器这些是业界通用形态与通用交互,不受版权保护; 受保护的是具体表达。因此下表把每一处都标明性质:通用 / 刻意不同 / UAK 独创。


1. 三个视图(而不是"时间轴 + 蓝图图")

视图 作用 类比
时间轴(默认) 编排:什么时候发生什么 通用形态
血缘(Explain) 解释:这条技能会对 GAS 产生什么影响,一跳一跳展开 UAK 独创(AbilityKit 的 explain 思想 + GAS 落地)
校验 治理:全量规则结果,可导出 通用思想的另一种形态

Able 是「Timeline 模式 + Blueprint Graph 模式」双模式;我们的资产是纯数据资产(非 Blueprint), 所以没有图模式,取而代之的是「血缘视图」。这既是架构必然,也是最强的差异化点。


2. 布局

┌──────────────────────────────────────────────────────────────────────────────┐
│ UAK · Fireball                      [⏮][▶][⏭]   18 / 90 f   60fps   [⚙]     │ 工具条
├───────────┬──────────────────────────────────────────────┬───────────────────┤
│ 视图       │                                              │ Inspector          │
│ ⌾ 时间轴   │   0.0      0.3      0.6      0.9      1.2    │ ┌ 时间 ─────────┐  │
│ ○ 血缘     │   ├────────┼────────┼────────┼────────┼─────┤ │  Start  0.30 s │  │
│ ○ 校验     │ M ▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░                      │ │  Dur    0.10 s │  │
│ ○ 预览     │ E          ▓▓▓▓                             │ ├ 目标 ─────────┤  │
│           │ P             ▓▓▓▓▓▓                        │ │  前方扇形 5m/90°│ │
│ 轨道       │ Q        ▓▓                                 │ ├ 效果 ─────────┤  │
│ ☑ Main     │ M                       ▓▓▓▓               │ │  GE_Damage      │ │
│ ☑ Effect   │                                            │ │   └ Damage=120  │ │
│ ☑ Cue      ├────────────────────────────────────────────┤ ├ 表现 ─────────┤  │
│ ☐ Motion   │ GAS 影响 @0.30s                             │ │  Cue.Fire.Hit   │ │
│ ☐ Rule     │  Tags  Ability.Fire · State.Casting        │ └ ───────────────┘ │
│           │  GE 2 待施加 · Cue 1 · Targets 3            │  [定位] [复制] [删]│
├───────────┴──────────────────────────────────────────────┴───────────────────┤
│ ⚠ 2 警告 · 0 错误   ▸ GE_Damage 未设置 SetByCaller   ▸ 时间轴末端溢出 0.20s    │ 常驻校验条
└──────────────────────────────────────────────────────────────────────────────┘
区域 职责
工具条 资产名、播放控制、帧/时间切换、帧率、保存与导出、设置
左栏 视图切换 + 轨道列表(开关 / 静音 / 折叠 / 增删 / 排序)——属性不在这里
中央 时间轴画布(标尺 + 轨道 + 片段 + 光标 + Markers),主工作区
GAS 影响条 随光标实时汇总"此刻生效的 Tag / 待施加 GE / Cue / 命中目标数"
右栏 Inspector 分层卡片:时间 / 目标 / 效果 / 表现 / 条件(不是平铺属性表)
底栏 常驻校验结果,双击定位
预览 独立 Tab(不常驻),播放时自动弹出浮窗

3. 与 Able 的逐处对照

位置 Able UAK 性质
模式 Timeline + Blueprint Graph 双模式 时间轴 / 血缘 / 校验 三视图(无图模式) 刻意不同
左栏 Ability 属性 视图切换 + 轨道列表 刻意不同
右上 常驻预览视口 预览为独立 Tab,可关闭 刻意不同
右栏 平铺属性表 Inspector 分层卡片 刻意不同
校验 弹窗(SAbilityValidatorResultsDlg) 常驻底栏,边改边报 刻意不同
校验实现 外部 Validator 按 Task 类绑定 Task 自带 Validate()(内聚,错误无法被配置出来) 刻意不同
分支 时间轴里的 BranchTask 独立 Rule 轨道 + GAS Tag/属性条件 刻意不同
— 无 GAS 影响条(随光标实时计算) UAK 独创
— 无 血缘视图(Explain,可下钻到属性数值) UAK 独创
— 无 轨道级开关(整体静音"表现"轨道,只跑逻辑) UAK 独创
轨道拖拽 / 缩放 / 吸附 / 播放 / 单帧步进 / 复制粘贴 有 有 通用交互(不受保护)
动画长度对齐 一键按动画长度裁剪技能 拖入 Montage → 按 Notify/NotifyState 生成片段与 Marker 通用思路,实现不同
运行时调试 UMG 列表 + 世界 Billboard 时间轴与 PIE 联动(光标跟随 + Trace 实时写入血缘视图) 通用思路,形态不同

4. 血缘视图(Explain)

设计期:由各 Task 的 GetGASImpact() 静态汇总;运行时(PIE):由 UAKTrace 写入真实数据。

Fireball @ 0.30s
├─ [Query] CollisionQuery  → 3 targets(扇形 5m / 90°)
│   └─ [Effect] ApplyGE(GE_Damage, Instant)
│        ├─ Attribute: Health  -120  (SetByCaller: Damage=120)
│        ├─ Cue: GameplayCue.Fire.Hit
│        └─ Targets: A(-120)  B(-120, 格挡 -60)  C(miss)
└─ [Effect] ApplyGE(GE_Burn, Duration 3s)
     ├─ GrantedTags: State.Burning
     └─ Periodic: 每 0.5s  -10(共 6 跳)

价值:回答"这 120 点伤害是哪来的"——Able 只能告诉你"现在在跑哪个 Task"。


5. 交互约定

通用交互(业界通用,直接采用):拖拽移动片段 / 拖两端改时长 / Alt+拖拽复制 / Ctrl+滚轮缩放 / 空格播放暂停 / ,/.单帧步进 / Ctrl+C/V 复制粘贴 / 右键上下文菜单。

UAK 自己的交互:

交互 说明
轨道整体静音 左栏轨道勾选框,一键关掉"表现"类轨道做纯逻辑校验
从 Montage 生成 拖入 AnimMontage → 按 Notify/NotifyState 生成 Main 轨道片段与 Marker
GAS 影响条下钻 点击影响条上的条目 → 跳到血缘视图对应节点
校验双击定位 底栏条目双击 → 选中并滚动到对应片段
PIE 联动 PIE 中激活技能 → 编辑器时间轴光标跟随,血缘视图切换为实况
帧/秒切换 时间标尺可在 0.30s 与 18f 之间切换显示(工具条"按帧显示")
从 Montage 生成 读取预览 Montage:按长度设置技能长度 → 放一个全长 PlayMontage 任务 → 把动画 Notify 转成命名时间点

工具条

回到起点 / 播放·暂停 / 上一帧 / 下一帧 · 按帧显示 · 资产属性 / +标记 / 从 Montage 生成 · +轨道 / -轨道 / 上移 / 下移 · 复制任务 / 删除任务

  • "资产属性"用于在 Inspector 里编辑资产本身(长度、Tags、Markers、中断顺序)—— 否则点空白处只会清空选中,资产级属性无处可改。
  • "从 Montage 生成" 比 Able 的"按动画长度裁剪"多做一步:把 Notify 变成 Marker, 让后续编排能对齐到动画的关键帧。

快捷键

键 作用
空格 播放 / 暂停
← → 单帧步进(按住 Ctrl 为十帧)
Ctrl+D 复制当前选中的任务(复制件紧接在原任务之后)
Delete / Backspace 删除当前选中的任务
滚轮 时间轴缩放
点轨道头色条 整轨静音
点轨道头名称 选中轨道,在 Inspector 改复合模式

6. 技术实现要点(M2)

  1. FAssetEditorToolkit 派生(FUEAbilityKitAssetEditor),Tab 管理用 FWorkflowCentricApplication 或简单 FTabManager。
  2. 时间轴画布自绘 Slate(SWidget + OnPaint):标尺、网格、片段、光标、Markers。
  3. Inspector 复用 FPropertyEditorModule 的 DetailsView,通过自定义分类实现"分层卡片"。
  4. GAS 影响条与血缘视图共用 GetGASImpact() / UAKTrace 的同一份数据(FAKGASImpact)。
  5. 校验底栏:聚合 Task::Validate() 结果,改动后增量重算(不必全量)。
  6. 预览 Tab:独立预览场景(FPreviewScene)+ 预览角色 + Montage 播放。

7. M2 拆解顺序

  1. 编辑器骨架与 Tab 布局 → 2. 时间轴画布自绘 → 3. Inspector 卡片 →
  2. GAS 影响条 → 5. 校验底栏 → 6. 预览 Tab → 7.(M4)血缘视图接 UAKTrace 实况数据