GM指令系统
GM指令系统
背景
游戏开发中,GM(GameMaster)系统给开发人员或管理员,在游戏运行时直接与游戏底层进行交互。GM指令能够实现调试、状态修改、测试脚本执行等多种功能,是提升游戏调试效率和操作灵活性的重要工具。
使用
注册指令
该系统基于标签与反射,通过Attribute的方式注册GM指令。其中,[GMMethod] 用于注册指令,[GMMethodUI] 表示该指令需要在界面上显示为一个按钮。
- 注册无参数GM指令
1
2[ ]
public static void Func0() {……} - 注册多参数GM指令
1
2[ ]
public static void Func1(int param1, string param2) {……} - 注册GM指令,允许显示为Button
1
2
3
4
5
6[ ]
public static void Func2() {……}
//或
["指令名2")] ][GMMethod(
public static void Func2() {……}
输入指令
- 按 F2 键打开指令输入界面
- 指令提示(基于手动输入部分刷新备选项):
- 摁 Tab 键,显示补全预览:
- 补全后按 Tab 键以选择备选项:
- 选好备选项后,按任意键补全代码,空格键即可
- 根据提示补全参数,空格分隔:
- 按回车键执行指令
GM指令面板
- 按 ~ 键打开GM指令面板:
- 对应代码部分:
- 标签 [GMMethodUI] 表示该指令在面板显示
- 标签 [GMMethod([指令名], [参数名1], [参数名2]……)]
1
2[ ]
public static void SetCurrentEnergy(float value){}
指令参数可选范围
对于某些指令的参数,如果范围限定,比如枚举、配表项等方式,我们可以通过下拉列表的方式,来替代手动输入,以避免手动输入的麻烦和参数输错的问题。
- 以UI界面配表为例,配置项id即允许输入的参数名:
- 创建自定义代理参数类型,并继承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" };
}
}
- 例子中界面名参数是string类型,就继承GmParameterOptionsBase
- 替换指令的参数类型:
1
2
3//使用自定义参数类型 GMTypeUIName
[ ]
public static void OpenView(GMTypeUIName id){} - 指令下拉列表预览:
注意事项
- 指令参数数量匹配:确保 [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
评论