【參考博文】河樂不爲-《Unity 3D遊戲客戶端基礎框架》tolua 框架接入
引言
如何將 tolua 框架接入 Unity 項目中,這裏假設我們已經有一個項目,並且已經實現了一些基礎架構或者項目已經是完整的,此時,如何將 tolua 這個熱更新框架接入進來而不影響原項目的結構?
tolua引入
- 資源下載:
既然要將 tolua 引入項目,第一步肯定是先到 tolua 的 github 資源庫 中下載 tolua 的資源包 - 資源引入:
將下載的資源解壓縮,可以看到大致的目錄結構如下:
tolua-master
|-- Assets
|-- Luajit
|-- Luajit64
|-- ProjectSettings
|-- Unity5.x
這麼多文件夾,那些纔是我們真正需要的,將 Assets 文件夾下面的所有文件都複製到我們項目的 Assets 目錄中,由於我使用的是 Unity 5.5.1f1 ,所以需要將 Unity5.x/Assets/Plugins 文件夾也複製到我們項目的 Assets 目錄中與進行替換合併。
3. 其他:
Unity 編輯器導入目錄下新增的資源後,會彈出一個窗口提示 “點擊確定自動生成常用類型註冊文件,也可通過菜單逐步完成此功能” ,這裏直接點擊 【確定】 即可。
lua 起點
在 ToLua\Examples 目錄中提供了很多實用範例,對於剛入門的新手有很大幫助,這裏就不一一贅述了,我們直接進入到正式項目的應用實踐中。在 Tolua\Misc 中提供了一個 LuaClient.cs ,這個就是 tolua 提供給我們一個封裝好的啓動接口,可以通過繼承此類來編寫我們項目的 tolua 管理器,這裏我創建一個 LuaEngine.cs ,繼承自 LuaClient 並重寫兩個接口:InitLoader 和 LoadLuaFiles :
using System.Collections;
using System.Collections.Generic;
using LuaInterface;
using UnityEngine;
/// <summary>
/// tolua 啓動入口,將此腳本動態綁定到一個不銷燬的 GameObject 上,通常跟遊戲的 GameManagr 綁在同物體上
/// </summary>
public class LuaEngine : LuaClient {
protected override LuaFileUtils InitLoader()
{
return new LuaResLoader();
}
/// <summary>
/// 可添加或修改搜索 lua 文件的目錄
/// </summary>
protected override void LoadLuaFiles()
{
#if UNITY_EDITOR
// 添加編輯器環境下獲取 lua 腳本的路徑(Assets/lua)
luaState.AddSearchPath(Application.dataPath + "/lua");
#endif
OnLoadFinished();
}
}
在遊戲控制中心腳本 GameManager (綁定在遊戲起始場景中的一個 GameObject 上面,通常是一個 Empty GameObject)的 Awake 方法中,通過以下方式啓動此腳本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManager : MonoBehaviour {
private static GameManager _instance = null;
private LuaEngine _luaEngine;
public static GameManager Instance
{
get { return _instance; }
}
void Awake()
{
_instance = this;
// 設置爲切換場景不被銷燬的屬性
GameObject.DontDestroyOnLoad(gameObject);
Init();
}
/// <summary>
/// 遊戲管理器的初始化步驟
/// </summary>
void Init()
{
_luaEngine = gameObject.AddComponent<LuaEngine>();
}
}
執行啓動場景,可以看到最後輸出:
11:34:30.215-0: [Main.lua:3]:logic start
UnityEngine.Debug:Log(Object)
這是 Assets/Lua/Main.lua 的打印內容,這個腳本也就是所有 lua 邏輯的起始點:
--主入口函數。從這裏開始lua邏輯
function Main()
print("logic start")
end
--場景切換通知
function OnLevelWasLoaded(level)
collectgarbage("collect")
Time.timeSinceLevelLoad = 0
end
目錄結構優化
導入 tolua 的資源後,Assets 目錄下的資源會版的有點亂和雜,所以有必要根據項目原本的結構對 tolua 的一些目錄結構進行優化:
1.*Wrap.cs 目錄:
Assets/Source/Generate 是用來保存 tolua 生成的可供 lua 調用的 C# 類的綁定類,但是在我的項目中,習慣性把腳本放在 Assets/Scripts 目錄中,所以這裏我們只需要打開 Assets/Editor/Custom/CustomSettings.cs ,修改一下內容:
public static string saveDir = Application.dataPath + "/Scripts/Generate/";
在 Scripts 中創建一個 Generate 目錄,關閉 Unity 在重新啓動,會再像剛引入 tolua 那樣彈出一個窗口提示 “點擊確定自動生成常用類型註冊文件,也可通過菜單逐步完成此功能” ,這裏也是直接點擊 【確定】 即可。此時,在 Assets/Scripts/Generate 會生成一堆 *wrap.cs 的腳本文件,說明目錄修改成功。但是此時會有重名文件,必須把整個 Source 目錄刪掉。然後將 Source/LuaConst.cs 移動到 Assets/Scripts./..目錄中。
- ToLua 目錄:
Assets/ToLua 目錄下是 tolua 框架最爲核心的一些庫,當然按照我們項目的規則;外部引入的第三方插件資源主要放在 Assets/ThirdParty 目錄中,這裏我們我們直接將整個 ToLua 目錄移動到第三方插件目錄,然後需要修改幾個地方:
(1)LuaConst.cs 中的 toluaDir :
public static string toluaDir = Application.dataPath + "/ThirdParty/ToLua/Lua"; //tolua lua文件目錄
(2)CustomSettings.cs 中的 toluaBaseType :
public static string toluaBaseType = Application.dataPath + "/ThirdParty/ToLua/BaseType/";
完成上述兩項設置及完成了目錄的修改。