Unity+VSCode+XLua+断点调试

Unity安装

去官网下个相对较新的版本,我这里是使用的2020.2.6f1,证书选择个人版。Unity下载页面

IDE安装

个人习惯使用VSCode,去官网下个新版就行。Visual Studio Code - Code Editing. Redefined

为了保证能对C#代码进行断点调试,我们还需要给IDE装上这个C#和DebuggerForUnity的插件。

编写C#代码并断点调试

新建一个Unity项目并打开,在编辑器顶部菜单栏找到Edit > Preferences > ExternalTools将External Script Editor引用改成VSCode。然后再回到Unity编辑器顶部菜单栏找到Assets > Open C# Project 打开我们的工程代码。

新建一个HelloWorld.cs
Ctrl+Shift+P呼出面板
按F5进入调试模式,选择当前正在运行的Unity程序
再回到Unity工程将HelloWorld.cs挂载到当前场景内,点击运行

正常情况下是能断点成功的,如果不正常,多半是系统的.NET版本没对,用这个试试NET Framework 4.7.1 Developer Pack-enu

代码热更方案

我选择的是腾讯的XLua,虽然没怎么深入了解过,但市面上已经有很多商业游戏对其进行过了验证,要满足我们的需求那自然是绰绰有余。

到GitHub上找到当前最新的发布版本 Release Tag:v2.1.16_android_release_lib · Tencent/xLua · GitHub 下载完成后解压一下,由README.md我们能得知一些XLua的基础概念与以下几点:

1.需要将Assets文件夹内的东西拷进Unity工程目录下的Assets文件夹内。(当然如果你有目录洁癖也可以删掉XLua文件夹下的Doc、Examples、Tutorial)

2.用c#执行一个Lua脚本。新建一个c#脚本,挂载到当前Unity场景内,脚本内容如下:

using XLua;
using System.IO;

    void Start()
    {
        // 启动lua管理器
        LuaEnv _luaEnv = new LuaEnv();
        // 重写lua内的require函数回调,方便自定义载入路径
        _luaEnv.AddLoader(CustomLoader);
        // 启动一个脚本载体
        LuaTable _scriptEnv = _luaEnv.NewTable();

        // 为该脚本添加XLua提供的全局变量及函数
        LuaTable meta = _luaEnv.NewTable();
        meta.Set("__index", _luaEnv.Global);
        _scriptEnv.SetMetaTable(meta);
        meta.Dispose();
        _scriptEnv.Set("self", this);

        // 执行该脚本
        var _luaScript = LoadLuaFile("HelloWorld");
        _luaEnv.DoString(_luaScript, "HelloWorld", _scriptEnv);

        // 取到Lua脚本内的指定名称函数并运行
        Action _luaFunction;
        _scriptEnv.Get("MyFunction", out _luaFunction);
        _luaFunction();
        // 最后当你不再需要的时候,记得使用.Dispose()销毁脚本载体及管理器
    }
    /// 
    /// 自定义载入回调
    /// 
    /// 
    /// 
    byte[] CustomLoader(ref string filepath)
    {
        filepath = filepath.Replace(".", "/");
        return LoadLuaFile(filepath);
    }

    // 将自定义目录下指定名字的lua脚本加载为字节流
    byte[] LoadLuaFile(string filePath)
    {
        var fileAddress = Path.Combine(Application.dataPath + "/Lua/", filePath + ".lua");
        FileInfo _info = new FileInfo(fileAddress);
        if (_info.Exists)
        {
            StreamReader r = new StreamReader(fileAddress);
            return System.Text.Encoding.UTF8.GetBytes(r.ReadToEnd());
        }
        return null;
    }

3.在Unity工程内Assets/Lua 目录下新建一个文本文档"HelloWorld.lua",打开进行如下编辑

print("Hello World")

function MyFunction()
    print("This is MyFunction")
end

最后回到Unity运行场景,正常情况下这时控制台就会打印出你的"Hello World"和"This is MyFunction"了。

VSCode上断点调试Lua

我是使用的luaide,它除了能断点调试之外还有很多便捷功能,虽然是付费插件,但是100块买断的价格也算很亲民了,换设备也能继续使用,强烈推荐。


安装插件

安装完毕之后进行调试设置


打开VSCode设置界面,找到这个打钩

重启VSCode,正常情况等待片刻就会自动下载调试文件到本地

点击找到调试文件

把整个luadebug文件夹拷贝到Unity工程的Asstes/Lua下面,之后会看到Unity报LuaDebugTool.cs文件有错,点开纠正下语法错误,把无关的代码注释一下就好了。

然后把下面代码放在lua脚本内,保证它在最开始被执行到

local breakSocketHandle,debugXpCall = require("luadebug.LuaDebugjit")("localhost",7003)
breakSocketHandle()

之后我们配置调试参数



会自动创建launch.json文件并且进行各种lua框架的调试配置,如果有代码洁癖的话,我们可以只保留XLua的,即

        {
            "name": "Unity-xlua",
            "type": "lua",
            "request": "attach",
            "runtimeType": "Unity",
            "localRoot": "${workspaceRoot}",
            "fileExtNames": [
                ".lua",
                ".txt",
                ".lua.txt",
                ".bytes"
            ],
            "port": 7003,
            "printType": 1
        },

完事后我们验证下成功与否,按下F5进入调试模式,再运行Unity场景


OhYeah,大功告成

你可能感兴趣的:(Unity+VSCode+XLua+断点调试)