[2]自定義Lua解析方式
在上文中我們學會學會更改載入路徑,載入對應資料夾下的Lua指令碼。
預設解析載入的lua指令碼存在的檔案位置非AB包或者Resources資料夾下往往不能隨包體更新,這顯然不符合熱更需要。因此自定義繼承
tolua中lua指令碼載入解析類LuaFileUtils來重寫對應的lua指令碼載入方法。
public class LuaCustomLoad:LuaFileUtils
{
/// <summary>
/// 優先從AssetBundle中載入(預設AB檔名稱為lua) Resources資料夾下lua資料夾載入
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public override byte[] ReadFile(string fileName)
{
//字尾名稱檢查處理
if (!fileName.EndsWith(".lua"))
{
fileName += ".lua";
}
//二進位制檔案流
byte[] buffer = null;
//解析路徑名稱
string[] tempFilePath = fileName.Split('/');
Debug.Log(tempFilePath[tempFilePath.Length - 1]);
TextAsset luaText = LoadAssetBundleManager.Instance().LoadResource<TextAsset>("lua",tempFilePath[tempFilePath.Length - 1]);
if (luaText != null)
{
buffer = luaText.bytes;
}
//從Resources資料夾下載入Lua指令碼
if (buffer == null)
{
Debug.Log("從Resources資源包中載入");
string filePath = "Lua/" + fileName;
//讀取檔案
TextAsset textAsset = Resources.Load<TextAsset>(filePath);
if (textAsset != null)
{
buffer = textAsset.bytes;
//解除安裝資源
Resources.UnloadAsset(textAsset);
}
}
return buffer;
}
}
將lua指令碼打入Resorces資料夾下(.lua檔案)
測試:此時還未將Lua指令碼打入AssetBundle包 所以從Resources資料夾下載入lua指令碼。(報錯是因為AssetBundle檔案不存在!後期可以完善此lua檔案載入指令碼邏輯)
現在我們將lua指令碼打入AssetBundle中
此處踩坑:Lua指令碼打入AB包失敗!將lua指令碼字尾新增 [.txt] ,打包之前將toLua指令碼清空。
測試使用自定義指令碼要點:
在使用LuaState之前先例項化自定義的載入方法:
這樣,繼承的LuaFileUtils的自定義類會呼叫其建構函式,將子類例項化的this賦值給instance,從而執行子類重寫的ReadFile方法。
測試程式碼: