前言
我们在使用Unity开发游戏的时候,往往会需要GM工具来测试游戏稳定性,在游戏中呼出对话框输入命令行执行对应GM代码是非常高效的(下图来自B站Up:https://www.bilibili.com/video/BV1v741187To)
![b232d0dffaea77e9ad670d8aae54f63a.png](https://i-blog.csdnimg.cn/blog_migrate/c15166e45b7dd6b54ff3bbfcb9daefe6.jpeg)
此外,对于项目中不断增加的MenuItem编辑器拓展,每次使用工具都要去翻找对应的条目也是很麻烦的一件事,尤其是对于嵌套层次稍深的条目。。。
![bec27677b562f6b574b1bb49a52e0f1d.png](https://i-blog.csdnimg.cn/blog_migrate/cd18e53330d3cc9a3777893e0b60cd0c.png)
如果有个插件可以在Editor中输入Cmd执行对应MenuItem代码就好了,幸运的是上面提到的两个问题,我都找到了解决方案
正文
Runtime Cmd-UnityIngameDebugConsole
首先是我们Runtime的Cmd,推荐:https://github.com/yasirkula/UnityIngameDebugConsole插件
下载之后我们只需要把
![104f000810e9182b58b93d54e8dd4a4f.png](https://i-blog.csdnimg.cn/blog_migrate/9da0498067ece97685fda151e8ff699a.png)
放到场景中即可
如果我们想要在游戏中根据命令执行某个方法(这是最简单直接的用法,同样还支持参数传递,返回值,参数重定向等多种功能,可以去插件Readme查看更多)
[ConsoleMethod("测试await/async的Log","这是一条测试await/async的Log")]
然后打开Console,在对话框输入对应Cmd命令(自带智能提示和补全功能),选中Cmd,点击回车即可运行
![394f59302984f05cee9aa95be5e68c3f.png](https://i-blog.csdnimg.cn/blog_migrate/c3e61816a3d8945d0184a75c3a95aaba.jpeg)
Editor Cmd-MonKey Commander
然后是Editor下的Cmd(如果只是在Unity编辑器中,他可以同时担任Editor和Runtime的Cmd),推荐:https://assetstore.unity.com/packages/tools/utilities/monkey-productivity-commands-119938?locale=zh-CN
对于它的自定义Cmd方法,官网文档有很详细的介绍:https://sites.google.com/view/monkey-user-guide/command-creation
比如我们想让一个原本MenuItem方法变成我们Cmd启动的,可以这样
[Command("ETEditor_RsyncEditor","Rsync同步",Category = "ETEditor")]
然后我们开启Monkey Command Console(默认热键是`,可以在Setting中进行修改
![3bf88e5aa308f4875d05f3e3a8d9d7a7.png](https://i-blog.csdnimg.cn/blog_migrate/eb325398f0be76a395eb4ec6e78883a2.png)
)
输入对应Cmd,然后选中,点击回车即可运行
![654a1f1097a5e82aa6f9d51fc0d2f1cd.png](https://i-blog.csdnimg.cn/blog_migrate/abe522970827a5ab674c05dfb3c8a245.png)
我在使用Monkey Commander中遇到了一个奇怪的问题(Unity 2019.4.8 ltf):每次修改代码进行编译的时候都会报这个错误
![525a66a3c6ee70151d3c2dd4d4061039.png](https://i-blog.csdnimg.cn/blog_migrate/52b7704e760a228f713bdecabe4be3d8.jpeg)
猜测应该是Unity 2019 Editor底层的缓存机制更改,导致插件运行到这部分代码时会出错,所以我们可以使用dnSpy对其dll进行更改并且重编译即可
![db88d68e82668551b906e9c7fb98d7f6.png](https://i-blog.csdnimg.cn/blog_migrate/c42a7622bda5872ec2b41716041e771d.png)
总结
这两个插件的Cmd实现核心原理都很简单,都利用了C#强大的反射机制,但是他们提供的周边拓展如果自己实现的话,需要颇费一些功夫