# 前言

这个工具才做 MagicCivilizition 这个 Demo 的时候,很早就实现了。因为感觉 “挺好玩” 的,所以本来那时候就想发出来一下的,不过一推一推的,就...

游戏中,若是在 Editor 中的测试,貌似一般都是新加个测试脚本,然后挂上去,再弄个快捷键什么的 —— 这样很不方便吧?特别是很多时候涉及到一些比较复杂的测试,其灵活性与专门的控制台根本没法比。而且发布之后,“测试脚本” 这东西也肯定不能发出去的。

加之看到不少单机游戏,不少都具有一个专门的 “控制台”。
所以就想到了这个,另外,为了避免被 “玩家” 滥用,我实现的版本特别加入了 “权限” 要求,并采用 MD5 加密,就算反编译也只能得到一串 MD5 码。

GitHub 地址

如图:

# 内容

CheatSystem 主要采用反射,通过搜索 “CheatItem” 的子类 (即要求扩展的命令必须继承于 “CheatItem”),然后采用反射调用指定的方法而实现。

首先说一下权限,以及密码的设置。

# 权限及密码

权限的定义在 / Core/EnumRootLevel.cs 脚本中,如下代码所示:

s
public enum EnumRootLevel
    {
        [Passward(null, "玩家")]
        Player,
        [Passward("4D3CA37D310F95E4A06AB2A503A55B87", "一级")]
        One,
        [Passward("E89BBA290D125803653FC3CC5FB726AD", "二级")]
        Two,
        [Passward("B47C67EB1EAE84056537D2661EDA4149", "三级")]
        Three,
        [Passward("1BA7A4573ECD2668E1E63B9662560B78", "管理员")]
        Max,
    }

在这其中,枚举代表了权限等级,枚举之上的 Passward 特性,则定义了获取该权限等级的密码,以及权限的名字。
密码为 MD5 格式,可以先计算出密码的 MD5,然后填写进来(这样做是为了避免被反编译获取到明文密码)。
默认几个权限如上代码所示,若需要新增权限,只需要按照上面的格式加进去即可。

# 扩展功能

对于扩展新的功能,因为这个控制台主体是使用反射实现的,所以要求很简单:在继承于 “CheatItem” 类中,写下 public 的方法即可。
例如:

s
[CommandInfo("生成一张当前屏幕所有信息截图(如控制台、UI等都会算进去)")]
        public string CaptureScreenshot()
        {
            string path = GetCaptureScreenshotPath();
            UnityEngine.Application.CaptureScreenshot(path);
            return "截图已保存至 <color=yellow>" + path + "</color>";
        }

其中,方法之上的 “CommandInfo” 特性是该方法的功能说明,可以在忘记功能作用时,于控制台中输入 “Help XXX” 获取这个帮助信息。

所有继承于 “CheatItem” 的类,都会被控制台所获取到,并在输入命令时执行。

另外,若想在输入类名时,直接得到结果(直接执行),那么可以参考 Clear(清屏)命令,只需在类中加入方法 “SingleMethod” 即可.
如:

    [CommandInfo("清除控制台当前所有文本信息")]
    public class Clear : CheatItem
    {
        public void SingleMethod()
        {
            UICheatSystem.GetInstance.ClearText();
        }
    }

# 使用

在场景中任意物体上,挂载 “CheatSystem” 脚本即可。默认为按下 “~” 键打开,若有需要,可自行更改相应代码。

使用方法类似于系统的 Console,其格式为:“类名 + 方法名 + 方法参数”

例如,输入自带的 (我实现时默认扩展的通用命令) 命令:

Tools SystemInfo

就能够显示如下信息:

显示系统信息命令

以上。