VSCode + EmmyLua 调试 Unity Lua(最简接入 + 不阻塞运行版)


VSCode + EmmyLua 调试 Unity Lua(最简接入 + 不阻塞运行版)

本文给出一套最小可用 、同时不影响正常运行 的接入方案:

即使 VSCode 没开启调试,Unity 也不会报错或中断;当你需要调试时再连接。

适用:

text 复制代码
Unity + ToLua / XLua / SLua / 自研 Lua

一、最终效果

text 复制代码
不开 VSCode 调试 → Unity 正常运行(不会报错)
开 VSCode 调试 → Lua 命中断点

二、原理(非常关键)

EmmyLua 的模式是:

text 复制代码
Lua 主动连接 VSCode(tcpConnect)

因此:

text 复制代码
VSCode 没开 → 连接会被拒绝(connection refused)

解决思路就是:

text 复制代码
把连接过程用 pcall 包起来 → 失败也不影响运行

三、目录结构(标准)

假设你的 Unity 项目:

text 复制代码
D:/Users/Administrator/Documents/goods-triple-tile/

结构如下:

text 复制代码
goods-triple-tile/
├── .vscode/
│   └── launch.json
│
├── Assets/
│   ├── Tools/
│   │   └── EmmyLua/
│   │       └── x64/
│   │           └── emmy_core.dll
│   │
│   └── Game/
│       └── Lua/
│           └── App/
│               └── Controller/
│                   └── Main/
│                       └── MainViewBehaviour.lua

四、复制 EmmyLua DLL

从 VSCode 插件目录复制:

text 复制代码
C:\Users\你的用户名\.vscode\extensions\tangzx.emmylua-xxx\debugger\emmy\windows\x64

复制到:

text 复制代码
Assets/Tools/EmmyLua/x64/

确认文件存在:

text 复制代码
emmy_core.dll

五、VSCode 配置(launch.json)

路径:

text 复制代码
项目根目录/.vscode/launch.json

完整内容:

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 最简接入代码(核心)

这是你当前方案的正确版本(修正过)

lua 复制代码
local function StartEmmyLuaDebugger()
    print("package.cpath before = " .. tostring(package.cpath))

    -- ⚠️ 必须用 /?.dll,不能写死 emmy_core.dll
    -- ⚠️ 必须用 .. 追加,不能用 = 覆盖
    package.cpath = package.cpath ..
        ";d:/Users/Administrator/Documents/goods-triple-tile/Assets/Tools/EmmyLua/x64/?.dll"

    -- 1. 安全加载
    local requireOk, dbgOrErr = pcall(require, "emmy_core")
    if not requireOk then
        print("EmmyLua调试器加载失败:" .. tostring(dbgOrErr))
        return
    end

    local dbg = dbgOrErr

    -- 2. 安全连接(关键点)
    local connectOk, connectErr = pcall(function()
        dbg.tcpConnect("localhost", 9966)
    end)

    if not connectOk then
        print("EmmyLua未连接(VSCode未启动调试),游戏继续运行:" .. tostring(connectErr))
        return
    end

    print("EmmyLua调试器连接成功")

    -- ⚠️ 不建议默认开启,否则 VSCode 没开会卡住
    -- dbg.waitIDE()
end

-- 最外层保护(防止极端异常)
local ok, err = pcall(StartEmmyLuaDebugger)
if not ok then
    print("EmmyLua调试器启动异常,游戏继续运行:" .. tostring(err))
end

七、为什么你原来的写法会出问题

你写的是:

lua 复制代码
package.cpath = "xxx/emmy_core.dll"

问题有两个:


❌ 问题1:require 找不到

Lua 的规则是:

lua 复制代码
require("emmy_core")

会去找:

text 复制代码
路径/?.dll → emmy_core.dll

所以必须写:

lua 复制代码
";路径/?.dll"

❌ 问题2:覆盖了 package.cpath

lua 复制代码
package.cpath = "xxx"

会把原来的所有 C 模块路径清空。

正确写法:

lua 复制代码
package.cpath = package.cpath .. ";xxx/?.dll"

八、为什么会出现 connection refused

报错:

text 复制代码
[Emmy]connection refused

原因:

text 复制代码
VSCode 没按 F5 → 没有监听 9966 端口

Lua 调用:

lua 复制代码
dbg.tcpConnect("localhost", 9966)

就会失败。


✅ 正确处理方式

必须这样写:

lua 复制代码
pcall(function()
    dbg.tcpConnect(...)
end)

这样:

text 复制代码
连接失败 → 打印日志 → 不影响 Unity 运行

九、启动顺序(必须)

text 复制代码
1. VSCode 打开项目根目录
2. 按 F5(启动调试)
3. Unity 点击 Play
4. Lua 执行 tcpConnect
5. 连接成功

如果反过来:

text 复制代码
Unity 先 Play → 必然 connection refused

十、如何查看调用来源(Call Stack)

断点命中后,在 VSCode 左侧:

text 复制代码
CALL STACK

示例:

text 复制代码
MainViewBehaviour.lua : 429
MainGameConfig.lua : 29

正确理解

text 复制代码
下面调用上面

也就是:

text 复制代码
MainGameConfig → MainViewBehaviour

记住:

text 复制代码
Call Stack 下面的是调用者

十一、调试神器:打印调用链

lua 复制代码
print(debug.traceback())

输出:

text 复制代码
stack traceback:
    MainViewBehaviour.lua:429
    MainGameConfig.lua:29

十二、是否使用 waitIDE()

lua 复制代码
dbg.waitIDE()

作用:

text 复制代码
等待 VSCode 连接后再继续执行

问题:

text 复制代码
VSCode 没开 → Unity 卡住

建议:

text 复制代码
默认关闭,只在需要时打开

十三、最终结论

这套最简方案的核心:

text 复制代码
1. require 用 pcall
2. tcpConnect 用 pcall(关键)
3. package.cpath 用追加 + /?.dll
4. VSCode 不开时也能运行

十四、一句话总结

text 复制代码
让调试"可选",而不是"强依赖"

如果你下一步要做更高级的:

text 复制代码
只在 Debug 模式自动连接
一键开关调试
自动识别 VSCode 是否启动
相关推荐
石油人单挑所有2 小时前
基于多设计模式下的同步&异步日志系统测试报告
服务器·c++·vscode·设计模式
乐飞鱼~万维网2 小时前
vscode 调试xdebug 配置问题
ide·vscode·编辑器
空中海2 小时前
第六篇:Unity专项方向
unity·游戏引擎
❆VE❆3 小时前
python基础篇(一):使用vscode搭建python相关环境
开发语言·vscode·python
mxwin3 小时前
Unity Shader 屏幕空间反射 (SSR) 原理解析
jvm·unity·游戏引擎·shader
心前阳光3 小时前
Unity之利用特性给ScriptableObject分组
unity·游戏引擎
mxwin3 小时前
Unity Shader 屏幕空间法线重建 从深度缓冲反推世界法线——原理、踩坑与 URP Shader 实战
unity·游戏引擎·shader
空中海3 小时前
第五篇:Unity工程化能力
elasticsearch·unity·游戏引擎
刘延林.3 小时前
ESP32-S3-AI-1 套件重新烧录自己写的程序
vscode