# 前言
这个工具才做 MagicCivilizition 这个 Demo 的时候,很早就实现了。因为感觉 “挺好玩” 的,所以本来那时候就想发出来一下的,不过一推一推的,就...
游戏中,若是在 Editor 中的测试,貌似一般都是新加个测试脚本,然后挂上去,再弄个快捷键什么的 —— 这样很不方便吧?特别是很多时候涉及到一些比较复杂的测试,其灵活性与专门的控制台根本没法比。而且发布之后,“测试脚本” 这东西也肯定不能发出去的。
加之看到不少单机游戏,不少都具有一个专门的 “控制台”。
所以就想到了这个,另外,为了避免被 “玩家” 滥用,我实现的版本特别加入了 “权限” 要求,并采用 MD5 加密,就算反编译也只能得到一串 MD5 码。
GitHub 地址
如图:
# 内容
CheatSystem 主要采用反射,通过搜索 “CheatItem” 的子类 (即要求扩展的命令必须继承于 “CheatItem”),然后采用反射调用指定的方法而实现。
首先说一下权限,以及密码的设置。
# 权限及密码
权限的定义在 / Core/EnumRootLevel.cs 脚本中,如下代码所示:
public enum EnumRootLevel | |
{ | |
[Passward(null, "玩家")] | |
Player, | |
[Passward("4D3CA37D310F95E4A06AB2A503A55B87", "一级")] | |
One, | |
[Passward("E89BBA290D125803653FC3CC5FB726AD", "二级")] | |
Two, | |
[Passward("B47C67EB1EAE84056537D2661EDA4149", "三级")] | |
Three, | |
[Passward("1BA7A4573ECD2668E1E63B9662560B78", "管理员")] | |
Max, | |
} |
在这其中,枚举代表了权限等级,枚举之上的 Passward 特性,则定义了获取该权限等级的密码,以及权限的名字。
密码为 MD5 格式,可以先计算出密码的 MD5,然后填写进来(这样做是为了避免被反编译获取到明文密码)。
默认几个权限如上代码所示,若需要新增权限,只需要按照上面的格式加进去即可。
# 扩展功能
对于扩展新的功能,因为这个控制台主体是使用反射实现的,所以要求很简单:在继承于 “CheatItem” 类中,写下 public 的方法即可。
例如:
[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
就能够显示如下信息:
以上。