在游戏开发过程中,调试是一件很让人头痛的事情,使用unity和c#开发的时候,总是会打开游戏----->发现有问题----->关游戏----->加log----->加测试代码----->开游戏----->测试,看log。或者打断点,在IDE里调试代码。又或者是有一个GM系统可以执行各种已经写好的指令,总之,很麻烦就是了,且没有时效性。
使用脚本语言开发的时候,可以直接在控制台中输入一行代码,就可以查看数据,或者执行一个命令,于是就想,能不能用c#实现类似的功能呢。
不想看废话的可以直接跳到XFramework–Console,里面有demo,运行后按键盘的~键位就可以调出控制台。
1.动态编译
c#动态编译的大致流程如下
public object ExcuteCode()
{
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
CompilerParameters compilerParameters = new CompilerParameters();
Assembly[] assemblys = AppDomain.CurrentDomain.GetAssemblies();
foreach (var item in assemblys)
{
compilerParameters.ReferencedAssemblies.Add(item.Location);
}
compilerParameters.GenerateExecutable = false;
compilerParameters.GenerateInMemory = true;
string code = "你的代码,写好类,写好方法,后面用反射调用";
CompilerResults cr = codeProvider.CompileAssemblyFromSource(compilerParameters, code);
if (cr.Errors.HasErrors)
{
var msg = string.Join(Environment.NewLine, cr.Errors.Cast<CompilerError>().First().ErrorText);
Debug.LogError(msg);
return null;
}
else
{
Assembly objAssembly = cr.CompiledAssembly;
object dyClass = objAssembly.CreateInstance("你的类名");
var methodInfo = dyClass.GetType().GetMethod("你的方法名");
methodInfo.Invoke()
}
}
这样,我们就已经可以在游戏运行的时候写一段代码来调用工程中的函数了,但是仅仅这样肯定不行,我希望可以在控制台中一行行的敲代码。最后实现了下面的效果。
2.控制台已完成的功能
执行一个方法,当有trace的时候控制台上也会显示
传参也是可以的,这里因为用的Vector3,还需要先using一下命名空间UnityEngine
获取某个变量的值,并存下
执行已经写好的GM命令
3.总结
目前的这个控制台是用UGUI做的,且动态编译不能在手机上执行,只有PC上可以。但是看log和gm命令都是可以的,ugui的控制台在手机上用起来太麻烦,打算基于udp做一个脱离于unity的控制台,这样就算是手机包也可以在pc上方便的看log以及发送gm指令了。