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 打开我们的工程代码。
正常情况下是能断点成功的,如果不正常,多半是系统的.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()销毁脚本载体及管理器
}
/// <summary>
/// 自定义载入回调
/// </summary>
/// <param name="filepath"></param>
/// <returns></returns>
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,正常情况等待片刻就会自动下载调试文件到本地
把整个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场景