準(zhǔn)備工作
===================================
生成調(diào)試配置
這里很多同學(xué)出現(xiàn)過一個問題,就是同時下載了很多的lua 調(diào)試插件,所以這里需要注意 如果使用luaide進行l(wèi)ua調(diào)試,
需要先禁用或卸載其他的lua調(diào)試插件.
步驟:
-
如果你沒有生成過調(diào)試配置 那么先生成
- 如果你已經(jīng)有調(diào)試配置了可修改/刪除工作目錄下的
.vscode/launch.json
- 根據(jù)調(diào)試需要選擇本地或者遠(yuǎn)程調(diào)試即可
attach 遠(yuǎn)程調(diào)試 Unity 調(diào)試都為遠(yuǎn)程調(diào)試 不分平臺請注意
{
"name": "Unity-ulua",
"type": "lua",
"request": "attach",
"runtimeType": "Unity",
"localRoot": "${workspaceRoot}",
"fileExtname": ".lua",
"port": 7003,
"printType": 1
}
- name:命名調(diào)試器選擇項名字
- type: 默認(rèn)配置不需要修改
- request:默認(rèn)配置不需要修改
- runtimeType:默認(rèn)配置不需要修改
- localRoot: 與本地調(diào)試不同,遠(yuǎn)程調(diào)試 localRoot 當(dāng)做scriptMap 一般情況下默認(rèn)為 ${workspaceRoot} 即可,如果你的代碼目錄是 ${workspaceRoot} 下載的某個路徑 也可明確指定 如 ${workspaceRoot}/scripts
- fileExtname:該選項ulua 用默認(rèn)值就可,如果項目中l(wèi)ua文件后綴不是.lua可修改為具體的后綴來告訴調(diào)試器 例如:"fileExtname": ".txt"
- port: 調(diào)試端口 和 調(diào)試代碼中的端口統(tǒng)一即可 無特殊需求
-
printType: print打印方式
- 控制臺和系統(tǒng)輸出
- 控制臺輸出
- 系統(tǒng)輸出
調(diào)試代碼添加
說明:
下載對應(yīng)的LuaDebug 或 LuaDebugjit 后放入腳本目錄中
local breakSocketHandle,debugXpCall = require("LuaDebugjit")("192.168.1.102",7003)
local breakSocketHandle,debugXpCall = require("LuaDebugjit")("localhost",7003)
1. IP地址當(dāng)本機調(diào)試時可使用localhost遠(yuǎn)程調(diào)試或移動設(shè)備端調(diào)試是需要輸入調(diào)試器所在機器具體的ip
2. port 端口 LuaIde 默認(rèn)配置中端口為7003 如有需要可執(zhí)行更改確保調(diào)試器配置端口和調(diào)用
代碼的端口統(tǒng)一即可
3. breakSocketHandle luaIde斷點及時刷新函數(shù),需要在定時器中調(diào)用 該函數(shù)確保斷點能夠及時的
發(fā)送到lua 客戶端
4. debugXpCall 程序異常監(jiān)聽函數(shù),用于當(dāng)程序出現(xiàn)異常時調(diào)試器定位錯誤代碼 ulua 中為找到合適的位置添加 可忽略該方法不影響調(diào)試,如果有可統(tǒng)一添加的位置可告知一下
開啟LuaSocket
ulua 默認(rèn)關(guān)閉了luaSocket 如果項目沒有開啟請自行開啟
打開 Assets/Manager/LuaManager.cs 并添加如下代碼
#region luaide 調(diào)試庫添加
//如果項目中沒有l(wèi)uasocket 請打開
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
static int LuaOpen_Socket_Core(IntPtr L)
{
return LuaDLL.luaopen_socket_core(L);
}
protected void OpenLuaSocket()
{
LuaConst.openLuaSocket = true;
lua.BeginPreLoad();
lua.RegFunction("socket.core", LuaOpen_Socket_Core);
lua.EndPreLoad();
}
#endregion
并在OpenLibs 方法中調(diào)用 OpenLuaSocket()
/// <summary>
/// 初始化加載第三方庫
/// </summary>
void OpenLibs() {
lua.OpenLibs(LuaDLL.luaopen_pb);
lua.OpenLibs(LuaDLL.luaopen_sproto_core);
lua.OpenLibs(LuaDLL.luaopen_protobuf_c);
lua.OpenLibs(LuaDLL.luaopen_lpeg);
lua.OpenLibs(LuaDLL.luaopen_bit);
//luaide socket 開啟
lua.OpenLibs(LuaDLL.luaopen_socket_core);
this.OpenLuaSocket();
//end luaide
this.OpenCJson();
}
示例文件:LuaManager.cs
在啟動文件中添加調(diào)試代碼
local breakSocketHandle,debugXpCall = require("LuaDebugjit")("localhost",7003)
local timer = Timer.New(function()
breakSocketHandle() end, 1, -1, false)
timer:Start();
高階用法(查看userdata 的值)
由于采用的是c#語言所以可以利用到反射機制這樣可以通過反射獲取一些c#類型的值顯示在調(diào)試器中
- 下載 LuaDebugTool.cs
將LuaDebugTool.txt 重命名為 LuaDebugTool.cs 后加入到Assets/Scripts/Utility/
目錄下
- 打開Editor 項目中的CustomSetting.cs
- 搜索
public static BindType[] customTypeList
所在位置添加如下代碼
_GT(typeof(LuaDebugTool)),
_GT(typeof(LuaValueInfo)),
-
重新生成warp 這里我采用的是Clear warp files
貼一張c# 變量值的圖