xLua自定义加载器
2021-10-09 18:11
1271 查看
xLua入门基础
环境配置
xLua是腾讯开发,据说比较先进;
下载下来后将Plugins和XLua文件夹考进项目;
Plugins多平台权限;XLua和C#交互;
test.lua文件中只写了一句
print(Hello LittlePerilla);
运行Lua代码
运行xLua代码需要创建lua解释器,结束要释放解释器;
DoString是将字符串当成lua代码执行;
//lua解释器 LuaEnv luaenv = new XLua.LuaEnv(); //运行lua代码,字符串当lua代码执行; luaenv.DoString("print('hello world!')"); //释放解释器 luaenv.Dispose();
运行C#代码
CS.为xLua中调用C#代码的关键字;
LuaEnv luaenv = new XLua.LuaEnv(); //运行lua代码,字符串当lua代码执行; luaenv.DoString("CS.UnityEngine.Debug.Log('hello world')"); luaenv.Dispose();
返回值
LuaEnv luaenv = new XLua.LuaEnv(); object[] data = luaenv.DoString("return 100, false"); Debug.Log($"{data[0]}__{data[1]}"); luaenv.Dispose();
自定义加载器
默认加载器路径为:steamingAssets;
LuaEnv luaenv = new LuaEnv(); //加载test.lua,这里的require是从默认加载器:steamingAssets中加载 luaenv.DoString("require('test')"); luaenv.Dispose();
自定义加载路径:
所有的lua脚本都放在Assets同级目录:DataPath\Lua;
xLua解释器中AddLoader方法;参数是一个委托;
public delegate byte[] CustomLoader(ref string filepath);
filepath这个path就是require(path)的参数;
通过委托返回.lua文件中所有的代码字节数据,提供给解释器调用;
public void MyLoader() { LuaEnv luaenv = new LuaEnv(); //自定义加载器,加入xlua的解析路径 //public delegate byte[] CustomLoader(ref string filepath); luaenv.AddLoader(ProjectLoader); luaenv.DoString("require('test')"); luaenv.Dispose(); } //自定义加载器先于系统加载器; //未加载到文件,返回空; public byte[] ProjectLoader(ref string filepath) { string path = Application.dataPath; path = path.Substring(0, path.Length - 6) + "DataPath/Lua/" + filepath + ".lua"; //读取文件为字节数组 if(File.Exists(path)) return File.ReadAllBytes(path); else { Debug.Log("未找到路径文件"); return null; } }
xLua解释器单例
LuaEnv在全局只能有一个,频繁创建和释放会造成性能浪费,因此写成单例,封装一些方法;
单例中包括私有方法——自定义加载器路径;
供外部调用方法:
Free——释放解释器
DoString——调用Lua代码
Gobal——获取Lua全局参数
public class XluaEnv { #region LuaEnv Singleton private static XluaEnv instance; private XluaEnv() { luaEnv = new LuaEnv(); luaEnv.AddLoader(ProjectLoader); } public static XluaEnv I { get { if (instance == null) instance = new XluaEnv(); return instance; } } #endregion #region LuaLoader private LuaEnv luaEnv; private byte[] ProjectLoader(ref string filepath) { string path = Application.dataPath; path = path.Substring(0, path.Length - 6) + "DataPath/Lua/" + filepath + ".lua"; //读取文件为字节数组 if(File.Exists(path)) return File.ReadAllBytes(path); else { Debug.Log("未找到路径文件"); return null; } } #endregion #region Public Function public void Free() { luaEnv.Dispose(); instance = null; } public object[] DoString(string fileName) { return luaEnv.DoString($"require('{fileName}')"); } public LuaTable Golbal() { return luaEnv.Global; } #endregion }
相关文章推荐
- 以自定义方式加载 lua 模块[云风blog]
- 修改lua的文件加载器,自定义lua文件加载
- Lua自定义方式加载模块
- Lua自定义方式加载模块
- 以自定义方式加载 lua 模块
- 修改lua的文件加载器,自定义lua文件加载
- 修改lua的文件加载器,自定义lua文件加载
- Unity使用C#通过自定义Loader加载指定目录的Lua脚本
- 修改ToLua加载自定义界面(NGUI)
- 以自定义方式加载 lua 模块
- 自定义加载进度动画
- 预加载动画(自定义)
- 异步加载网络数据,自定义进度条显示
- as3自定义加载图片类
- 返回顶部、懒加载、自定义右键
- Android自定义加载动画库zLoading
- 自定义ImageView实现类似微信朋友圈发图片点击出来阴影效果;同时使用Picasso加载网络图片
- Andriod Dialog 加载框 自定义,公用
- 带下拉刷新,上拉加载以及带自定义头布局的GridView
- 自定义的加载中弹出框,重写ProgessDialog