GM指令系统

背景

  游戏开发中,GM(GameMaster)系统给开发人员或管理员,在游戏运行时直接与游戏底层进行交互。GM指令能够实现调试、状态修改、测试脚本执行等多种功能,是提升游戏调试效率和操作灵活性的重要工具。

使用

注册指令

  该系统基于标签与反射,通过Attribute的方式注册GM指令。其中,[GMMethod] 用于注册指令,[GMMethodUI] 表示该指令需要在界面上显示为一个按钮。

  • 注册无参数GM指令
    1
    2
    [GMMethod("指令名0")] 
    public static void Func0() {……}
  • 注册多参数GM指令
    1
    2
    [GMMethod("指令名1", "参数名0", "参数名1")] 
    public static void Func1(int param1, string param2) {……}
  • 注册GM指令,允许显示为Button
    1
    2
    3
    4
    5
    6
    [GMMethodUI, GMMethod("指令名2")] 
    public static void Func2() {……}

    //或
    [GMMethodUI][GMMethod("指令名2")]
    public static void Func2() {……}

输入指令

  1. 按 F2 键打开指令输入界面
  2. 指令提示(基于手动输入部分刷新备选项):
  3. 摁 Tab 键,显示补全预览:
  4. 补全后按 Tab 键以选择备选项:
  5. 选好备选项后,按任意键补全代码,空格键即可
  6. 根据提示补全参数,空格分隔:
  7. 按回车键执行指令

GM指令面板

  1. 按 ~ 键打开GM指令面板:
  2. 对应代码部分:
    1. 标签 [GMMethodUI] 表示该指令在面板显示
    2. 标签 [GMMethod([指令名], [参数名1], [参数名2]……)]
      1
      2
      [GMMethodUI, GMMethod("设置角色体力值", "体力值")]
      public static void SetCurrentEnergy(float value){}

指令参数可选范围

  对于某些指令的参数,如果范围限定,比如枚举、配表项等方式,我们可以通过下拉列表的方式,来替代手动输入,以避免手动输入的麻烦和参数输错的问题。

  1. 以UI界面配表为例,配置项id即允许输入的参数名:
  2. 创建自定义代理参数类型,并继承GmParameterOptionsBase<[实参类型]>
    • 例子中界面名参数是string类型,就继承GmParameterOptionsBase
    • 重写 GetOptionsSource() 方法
    • 返回 object[] 即参数可选项
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      //继承 GmParameterOptionsBase<[实参类型]>
      public class GMTypeUIName : GmParameterOptionsBase<string>
      {
      //重写 GetOptionsSource() 方法
      protected override object[] GetOptionsSource()
      {
      //返回 object[] 即参数可选项
      return new object[] { "0", "1", "2" };
      }
      }
  3. 替换指令的参数类型:
    1
    2
    3
    //使用自定义参数类型 GMTypeUIName
    [GMMethodUI, GMMethod("打开UI界面", "界面id")]
    public static void OpenView(GMTypeUIName id){}
  4. 指令下拉列表预览:

注意事项

  • 指令参数数量匹配:确保 [GMMethod] 中定义的参数数量和方法的实际参数一致。若参数不匹配,系统会抛出错误提示。
  • 输入指令方式,参数都是以string类型输入,内部进行Parse转换为实参类型。
  • 对于使用自定义参数类型的指令,如果通过输入指令的方式执行,参数填写实参类型即可,已内部处理代理参数类型。
    比如 GMTypeUIName : GmParameterOptionsBase
    手动输入参数填写string类型即可。

内部实现

核心类

GMCommand.cs

  • GM系统初始化,包括程序集的所有指令查找和注册指令。
  • GM指令统一存储和管理,GM指令按指令名存储有序表。
  • 指令执行入口

数据结构

  • GMMethodData 指令的数据结构
  • GMParameterData 单个参数的数据结构

指令输入部分

GMCommandForInput.cs

  • 代码提示逻辑
  • 代码补全逻辑
  • 代码前缀等规则匹配逻辑

实参类型转换工具类

GMCommandParse.cs

  • 参数输入string转为常见的指定实参类型
  • 代理参数和实参对象转换

指令系统工具类

GMCommandUtils.cs

  • 指令查找及插入算法
  • string前缀匹配、完全匹配、大小比较

代理参数基类

GMParameterOptionsBase.cs

  • 完成实参类型代理
  • 配置代理参数的可选项范围

UI部分

  • 手动输入:GMCommandTab.cs
  • 指令面板:GMCtrl.cs