XLua+VSCode+EmmyLua搭建Lua断点调试环境

原来都是用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)

这里需要注意的是

  1. 端口号注意需要对应VSCode创建的运行配置文件端口号port
  2. 如果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文件路径

我是自己写了函数用于查找子文件路径,大概以这个思路去写代码实现就行了

调试方式

  1. VSCode中先运行调试,看到右下角出现“Wait for connection”即为成功
  2. 启动Unity,切回VSCode看到控制台显示“Connected”,并且第一步右下角弹窗消失,说明连接成功,断点可用