VSCode EmmyLua 调试 Unity Lua最简接入 不阻塞运行版本文给出一套最小可用、同时不影响正常运行的接入方案即使 VSCode 没开启调试Unity 也不会报错或中断当你需要调试时再连接。适用Unity ToLua / XLua / SLua / 自研 Lua一、最终效果不开 VSCode 调试 → Unity 正常运行不会报错 开 VSCode 调试 → Lua 命中断点二、原理非常关键EmmyLua 的模式是Lua 主动连接 VSCodetcpConnect因此VSCode 没开 → 连接会被拒绝connection refused解决思路就是把连接过程用 pcall 包起来 → 失败也不影响运行三、目录结构标准假设你的 Unity 项目D:/Users/Administrator/Documents/goods-triple-tile/结构如下goods-triple-tile/ ├── .vscode/ │ └── launch.json │ ├── Assets/ │ ├── Tools/ │ │ └── EmmyLua/ │ │ └── x64/ │ │ └── emmy_core.dll │ │ │ └── Game/ │ └── Lua/ │ └── App/ │ └── Controller/ │ └── Main/ │ └── MainViewBehaviour.lua四、复制 EmmyLua DLL从 VSCode 插件目录复制C:\Users\你的用户名\.vscode\extensions\tangzx.emmylua-xxx\debugger\emmy\windows\x64复制到Assets/Tools/EmmyLua/x64/确认文件存在emmy_core.dll五、VSCode 配置launch.json路径项目根目录/.vscode/launch.json完整内容{version:0.2.0,configurations:[{type:emmylua_new,request:launch,name:EmmyLua Unity Debug,host:localhost,port:9966,ext:[.lua,.lua.txt,.lua.bytes],ideConnectDebugger:false}]}六、Lua 最简接入代码核心这是你当前方案的正确版本修正过localfunctionStartEmmyLuaDebugger()print(package.cpath before ..tostring(package.cpath))-- ⚠️ 必须用 /?.dll不能写死 emmy_core.dll-- ⚠️ 必须用 .. 追加不能用 覆盖package.cpathpackage.cpath..;d:/Users/Administrator/Documents/goods-triple-tile/Assets/Tools/EmmyLua/x64/?.dll-- 1. 安全加载localrequireOk,dbgOrErrpcall(require,emmy_core)ifnotrequireOkthenprint(EmmyLua调试器加载失败..tostring(dbgOrErr))returnendlocaldbgdbgOrErr-- 2. 安全连接关键点localconnectOk,connectErrpcall(function()dbg.tcpConnect(localhost,9966)end)ifnotconnectOkthenprint(EmmyLua未连接VSCode未启动调试游戏继续运行..tostring(connectErr))returnendprint(EmmyLua调试器连接成功)-- ⚠️ 不建议默认开启否则 VSCode 没开会卡住-- dbg.waitIDE()end-- 最外层保护防止极端异常localok,errpcall(StartEmmyLuaDebugger)ifnotokthenprint(EmmyLua调试器启动异常游戏继续运行..tostring(err))end七、为什么你原来的写法会出问题你写的是package.cpathxxx/emmy_core.dll问题有两个❌ 问题1require 找不到Lua 的规则是require(emmy_core)会去找路径/?.dll → emmy_core.dll所以必须写;路径/?.dll❌ 问题2覆盖了 package.cpathpackage.cpathxxx会把原来的所有 C 模块路径清空。正确写法package.cpathpackage.cpath..;xxx/?.dll八、为什么会出现 connection refused报错[Emmy]connection refused原因VSCode 没按 F5 → 没有监听 9966 端口Lua 调用dbg.tcpConnect(localhost,9966)就会失败。✅ 正确处理方式必须这样写pcall(function()dbg.tcpConnect(...)end)这样连接失败 → 打印日志 → 不影响 Unity 运行九、启动顺序必须1. VSCode 打开项目根目录 2. 按 F5启动调试 3. Unity 点击 Play 4. Lua 执行 tcpConnect 5. 连接成功如果反过来Unity 先 Play → 必然 connection refused十、如何查看调用来源Call Stack断点命中后在 VSCode 左侧CALL STACK示例MainViewBehaviour.lua : 429 MainGameConfig.lua : 29正确理解下面调用上面也就是MainGameConfig → MainViewBehaviour记住Call Stack 下面的是调用者十一、调试神器打印调用链print(debug.traceback())输出stack traceback: MainViewBehaviour.lua:429 MainGameConfig.lua:29十二、是否使用 waitIDE()dbg.waitIDE()作用等待 VSCode 连接后再继续执行问题VSCode 没开 → Unity 卡住建议默认关闭只在需要时打开十三、最终结论这套最简方案的核心1. require 用 pcall 2. tcpConnect 用 pcall关键 3. package.cpath 用追加 /?.dll 4. VSCode 不开时也能运行十四、一句话总结让调试“可选”而不是“强依赖”如果你下一步要做更高级的只在 Debug 模式自动连接 一键开关调试 自动识别 VSCode 是否启动