Lua解析器管理器(封装解析器通用函数(销毁解析器,垃圾清理),通过ab包加载lua文件的加载器)
生活随笔
收集整理的這篇文章主要介紹了
Lua解析器管理器(封装解析器通用函数(销毁解析器,垃圾清理),通过ab包加载lua文件的加载器)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
(一)做一個lua管理器,保證解析器的唯一性,封裝一些解析器常用函數
單例模式代碼:
(二)通過ab包加載lua文件
(1)準備好lua文件的ab包
過程:
1.lua文件打成lua包,注意lua文件要改后綴.txt
2.通過assetbundle broswer打包(至少要用2019.3以上版本的unity才有這個)
選擇好打包平臺:我的是mac,打包壓縮格式為lz4
打包結果:
(2)編寫自定義ab包加載器,并讓luaenv添加這個自定義加載器
測試代碼:
using System.Collections; using System.Collections.Generic; using UnityEngine; using XLua;//要添加這個命名空間 using System.IO;public class LuaEnvTest : MonoBehaviour {// Start is called before the first frame updatevoid Start(){LuaMgr.GetInstance().Init();LuaMgr.GetInstance().DoString("require('Main')");}}測試結果:
這里是因為執行require時,會依次遍歷所有自定義加載器,如果都沒有,就去默認路徑Resources文件夾下找。
ps:只需要最后測試ab包的時候用ab包加載器,平時不需要,只需要用普通加載器
(3)luamgr的一點優化
1.不用每次都寫require,增加一個方法
2.得到lua的_G
/// <summary>/// 聲明了一個屬性,得到lua中得_G/// </summary>public LuaTable Global{get{return luaEnv.Global;}}整個完整的luaenv管理器的代碼:
using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using XLua;/// <summary> /// 保證解析器的唯一性,先繼承單例模式,也提供些解析器的函數 /// </summary> public class LuaMgr :BaseManager<LuaMgr> {//定義解析器對象private LuaEnv luaEnv;/// <summary>/// 聲明了一個屬性,得到lua中得_G/// </summary>public LuaTable Global{get{return luaEnv.Global;}}//初始化解析器public void Init(){if (luaEnv != null)return;luaEnv = new LuaEnv();//添加自定義加載器luaEnv.AddLoader(MyCustomLoader);//添加自定義的ab包加載器luaEnv.AddLoader(MyCustomABLoader);}/// <summary>/// 普通加載器/// </summary>/// <param name="filepath">lua文件名</param>/// <returns></returns>private byte[] MyCustomLoader(ref string filepath){string path = Application.dataPath + "/Lua/" + filepath + ".lua";if (File.Exists(path)){return File.ReadAllBytes(path);}else{Debug.Log("MyCustomLoader加載器加載lua文件失敗");return null;}}/// <summary>/// 用ab包的方式加載lua文件的加載器/// </summary>/// <param name="filepath">lua文件名</param>/// <returns></returns>private byte[] MyCustomABLoader(ref string filepath){Debug.Log("用ab包加載lua文件");//找到ab包的路徑string path = Application.streamingAssetsPath + "/lua";//加載含有lua文件的ab包AssetBundle luaab = AssetBundle.LoadFromFile(path);//加載ab包里的lua文件,讀成txt,這里注意,因為打包的時候后綴是.lua.txt所以文件名還要加上個.luaTextAsset txt = luaab.LoadAsset<TextAsset>(filepath + ".lua");return txt.bytes;}//執行lua文件public void DoString(string str){if (luaEnv == null){Debug.Log("lua解析器未初始化");return;}luaEnv.DoString(str);}/// <summary>/// 拼接require不用寫那么多次require/// </summary>/// <param name="filepath">lua文件名</param>public void DoLuaFile(string filepath){string str = string.Format("require('{0}')", filepath);DoString(str);}//清空垃圾public void Tick(){if (luaEnv == null){Debug.Log("lua解析器未初始化");return;}luaEnv.Tick();}//銷毀解析器public void Dispose(){if (luaEnv == null){Debug.Log("lua解析器未初始化");return;}luaEnv.Dispose();luaEnv = null;} }總結
以上是生活随笔為你收集整理的Lua解析器管理器(封装解析器通用函数(销毁解析器,垃圾清理),通过ab包加载lua文件的加载器)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王思聪吃热狗 - 飞机大战小游戏
- 下一篇: 【STM32】STM32CubeMX使用