原来都是用print来打印输出调试的,最近在公司使用断点,发现真的十分方便,尤其是针对Lua这种解释型语言,都不需要重启项目,今天在家自己搭建测试环境,发现还是有些坑的,专门写篇博客记录一下。
VSCode环境搭建
安装VSCode插件 - EmmyLua
直接通过VSCode的扩展商店下载,不得不说,VSCode的插件安装是我体验过所有IDE中最简单的了
创建运行配置文件
创建launch.json
注意ideConnectDebugger需要改成true,port可以使用默认,也可以自定义,但是后续Unity中一定要对应
Unity环境搭建
导入DLL文件 - emmy_core.dll
当VSCode中EmmyLua插件安装完毕后,在C:\Users\[用户名]\.vscode\extensions\tangzx.emmylua-0.3.49\debugger\emmy\windows\x64目录中可以找到emmy_core.dll文件,将其丢到Unity工程中的Plugins目录中
将emmy_core.dll导入XLua
具体如何内置库,可以参考Windows平台下的XLua第三方库的扩展编译
这里不过多的讲述细节
添加DLL引用
将下述代码放置在XLua DLL管理的类中
#if UNITY_EDITOR
// 这里会自动去Plugins文件夹中查找dll,所以不需要绝对路径,如果dll不愿意放置在工程里,此处可以改为绝对路径
[DllImport("emmy_core.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int luaopen_emmy_core(System.IntPtr L);
[MonoPInvokeCallback(typeof(LuaDLL.lua_CSFunction))]
public static int LoadEmmyCore(System.IntPtr L)
{
return luaopen_emmy_core(L);
}
#endif
内置XLua库
通过LuaEnv的AddBuildin函数完成库的内置
#if UNITY_EDITOR
LuaEnv.AddBuildin("emmy_core", XLua.LuaDLL.Lua.LoadEmmyCore);
#endif
调试启动代码
在Lua的入口脚本合适的位置添加下述脚本
local dbg = require('emmy_core')
dbg.tcpConnect('localhost', 9966)
这里需要注意的是
- 端口号注意需要对应VSCode创建的运行配置文件端口号port
- 如果VSCode并未运行调试,这两句代码找不到端口会报错的,后续建议添加pcall防止抛出异常程序停止,这里为了节省篇幅,就不写了
指定Lua文件
主要是为了EmmyLua可以找到对应的Lua文件,有些时候,虽然监听端口成功,但是具体在文件内设置的断点还是停不下来,这种情况发生的原因就是Lua文件并未指定
这里针对XLua的两种常用加载方式,简单说说指定Lua文件的方法
DoString()
将第二个参数chunkName改为具体的Lua文件名
string filePath = Path.Combine(Application.dataPath, "lua/main.lua.txt");
LuaEnv.DoString(File.ReadAllBytes(filePath), "main.lua.txt");
这种方式我也不太常用,只有在单文件加载的时候测试过
AddLoader()
这种方式,算是比较主流加载的方式,需要将filepath在函数内赋值为具体的lua文件路径
我是自己写了函数用于查找子文件路径,大概以这个思路去写代码实现就行了
调试方式
- VSCode中先运行调试,看到右下角出现“Wait for connection”即为成功
- 启动Unity,切回VSCode看到控制台显示“Connected”,并且第一步右下角弹窗消失,说明连接成功,断点可用