You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
AdLike2048/docs/方案-GM可视化模块.md

3.0 KiB

方案:可视化可扩展 GM 模块

更新日期:2026-10-19

1. 目标

将单文件输入型 GM(assets/script/game/GM.ts)重构为:

  • mx 通用壳:快捷按钮 / 滑动开关 / 内容面板,可拷到任意 Cocos 项目
  • 项目命令注册:业务 Action + 内容面板工厂,换项目整夹替换

2. 分层

层 路径 职责
框架 assets/mx/module/gm/ Registry、Host、Shell、View、内置面板;禁止依赖 script/
项目 assets/script/gm/ Host 注入、命令注册、表驱动 Picker、业务 Action

依赖方向:script/gm → mx/gm + Manager;mx/gm 绝不引用 script/。

3. 三种控件

Kind 用途 示例
Quick 一键动作 复制存档、每日重置、发宝石
Toggle 开/关 广告、营地免伤、商店无限
Content 可视化子页 / 内嵌整页 道具图标点选、关卡列表、段位步进;JSON 用 textArea

4. Tab 结构(本项目)

Tab 内容
常用 仅快捷按钮 + 快捷开关;尾部追加「钉到常用」的项
道具 embed 道具点选(选中高亮)
段位 embed 段位/星级(选中高亮)
通用 数值、营地开关、固定地图、局内血量、危险重置;每项可钉常用
词条 embed buff 选择
存档 embed 存档编辑

已去掉独立「战斗」Tab,原战斗项并入「通用」。

5. 开发者扩展(优先用 GmEasy)

日常加功能只改 ProjectGmBootstrap._register,链式几行即可:

new GmEasy()
  .tab('常用')
  .btn('复制存档', () => copy())
  .sw('显示广告', () => on, v => set(v))
  .tab('道具')
  .embed('itemPicker')
  .tab('通用')
  .pinable().num('金钱', () => get(), v => set(v))  // 可钉到常用
  .pinable().sw('营地免伤', () => on, v => set(v))
  .danger('重置', '确定?', () => reset())
  .commit();
  • .pinable():标记下一条命令可钉到「常用」;钉选状态存 sys.localStorage(gm.pin.{id})
  • .embed(panelId):当前 Tab 整页嵌入面板(无二次点击入口)

底层仍是 IGmCommand / GmRegistry;自定义面板:GmRegistry.registerPanel(id, () => new XxxPanel())。

内置面板 id:numberStepper、confirmQuick、textArea。

6. 换项目接入

  1. 拷贝 assets/mx/module/gm/
  2. 实现 IGmHost(约 30 行)
  3. new GmEasy()...commit() 写命令;需要时 registerPanel
  4. GmShell.bindHost + GmShell.show()

7. 入口

  • 设置页 GM.show() → 委托 ProjectGmBootstrap.show() → GmShell
  • 挂载 UILayer.DeBug
  • 显隐受 IGmHost.isEnabled() 约束(浏览器或 sdkConfig.isOpenGM)
  • 旧 gm.prefab 已从 Boot 预载移除;武器等级/预设仍走 PopGM 预制体

8. 实现清单

模块 路径
类型/注册/壳/视图/内置面板 assets/mx/module/gm/
Host / Actions / Panels / Bootstrap assets/script/gm/
门面 assets/script/game/GM.ts(薄委托,无 EditBox/switch)