(一)做一个lua管理器,保证解析器的唯一性,封装一些解析器常用函数
单例模式代码:

/// <summary>
/// 单例模式基类
/// </summary>
public class BaseManager<T> where T:new()
{private static T instance;public static T GetInstance(){if (instance == null){instance = new T();}return instance;}
}
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using XLua;/// <summary>
/// 保证解析器的唯一性,先继承单例模式,也提供些解析器的函数
/// </summary>
public class LuaMgr :BaseManager<LuaMgr>
{//定义解析器对象private LuaEnv luaEnv;//初始化解析器public void Init(){if (luaEnv != null)return;luaEnv = new LuaEnv();//自定义加载器luaEnv.AddLoader(MyCustomLoader);}private byte[] MyCustomLoader(ref string filepath){string path = Application.dataPath + "/Lua/" + filepath + ".lua";Debug.Log(path);if (File.Exists(path)){return File.ReadAllBytes(path);}else{Debug.Log("MyCustomLoader加载器加载lua文件失败");return null;}}//执行lua文件public void DoString(string str){if (luaEnv == null){Debug.Log("lua解析器未初始化");return;}luaEnv.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;}
}

(二)通过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 System.IO;
using UnityEngine;
using XLua;/// <summary>
/// 保证解析器的唯一性,先继承单例模式,也提供些解析器的函数
/// </summary>
public class LuaMgr :BaseManager<LuaMgr>
{//定义解析器对象private LuaEnv luaEnv;//初始化解析器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;}

测试代码:

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,增加一个方法

/// <summary>/// 拼接require不用写那么多次require/// </summary>/// <param name="filepath">lua文件名</param>public void DoLuaFile(string filepath){string str = string.Format("require('{0}')", filepath);DoString(str);}

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文件的加载器)相关推荐

  1. C#调用Lua 3、创建Lua解析器管理器

    首先为什么我们需要一个Lua解析器管理器? 因为每次创建一个新的C#调用lua类时,我们都需要创建一个lua解析器,步骤重复,且难以保证解析器唯一性.因此创建一个lua解析器管理类,来保证LuaEnv ...

  2. Unity中AB包详解(超详细,特性,打包,加载,管理器)

    Unity中的AssetBundle详解 AssetBundle的概念 AssetBundle又称AB包,是Unity提供的一种用于存储资源的资源压缩包. Unity中的AssetBundle系统是对 ...

  3. lua文件迁移小工具(编辑器下直接使用,将.lua文件变成定制的AB包文件)

    作用:将工程的某个文件夹下的所有.lua文件转换成txt文件,并将这些txt文件放到自定义文件夹下,并且统一修改为自定义的ab包名. 因为:AB包不支持.lua文件,所以需要转成txt文件. usin ...

  4. springmvc多个视图解析器管理跳转资源

    springmvc多个视图解析器管理跳转资源 项目结构 第一步:将所有资源交由springmvc管理 <servlet><servlet-name>springmvc</ ...

  5. Web版RSS阅读器(四)——定制自己的Rss解析库myrsslib4j

    在上篇博文<Web版RSS阅读器(三)--解析在线Rss订阅>中,已经提到了遇到的问题,这里再详细说一下. 在解析rss格式的订阅时,遇到的最主要的问题是,出现了"Server ...

  6. #深度解析# 深度学习中的SGD、BGD、MBGD、Momentum、NAG、Adagrad、Adadelta,RMSprop、Adam优化器

    关于SSE.MSE.RMSE.R-Squared等误差公式的深度解析请参考我的这篇博文->#深度解析# SSR,MSE,RMSE,MAE.SSR.SST.R-squared.Adjusted R ...

  7. 05.视频播放器内核切换封装

    05.视频播放器内核切换封装 目录介绍 01.视频播放器内核封装需求 02.播放器内核架构图 03.如何兼容不同内核播放器 04.看一下ijk的内核实现类 05.看一下exo的内核实现类 06.如何创 ...

  8. 封装axios加载动画Loding——vuex+axios拦截器

    封装axios加载动画Loding--vuex+axios拦截器 前言:我们在axios发送请求时候,会存在请求等待时长,我们一般会加一个动画,如果很多个时候一个一个的加动画代码看起来很臃肿很冗余,我 ...

  9. 苹果cms V10播放器管理页面操作说明

    首先是对各功能解释 排序:播放器的序号 编码:采集视频的时候,资源站有个来源,对应的是我们自己程序的播放器编码,如果采集了视频,我们本地没有这个编码的播放器,则不显示视频播放数据 名称:播放器的名称 ...

  10. 第十九章——使用资源调控器管理资源(2)——使用T-SQL配置资源调控器

    第十九章--使用资源调控器管理资源(2)--使用T-SQL配置资源调控器 原文: 第十九章--使用资源调控器管理资源(2)--使用T-SQL配置资源调控器 前言: 在前一章已经演示了如何使用SSMS来 ...

最新文章

  1. Linux 下各个目录的作用及内容
  2. 005-算法-分治法
  3. VB 长整型和字节数组的转换问题 (LongByte)
  4. canpro脚本_AE/PR脚本-创建编辑导入导出专业字幕脚本 Subtitle Pro 2.8.0 + 使用教程...
  5. 哈希表数据结构_Java数据结构哈希表如何避免冲突
  6. 数学图形(1.47)贝塞尔(Bézier)曲线
  7. 计算机图形学笔记 (第一周)
  8. 软件测试的出路到底在哪?
  9. Linux Futex的设计与实现(转)
  10. 回复失恋男的来信(转)
  11. 洛谷 P4344 [SHOI2015]脑洞治疗仪
  12. 桌面魔术可以用透明桌子揭密
  13. js将html替换字符串,js 替换字符串指定内容 javascript 替换指定位置的字符
  14. xor命令,运算优先级,Matlab计算规则(从左至右),舍入误差,取整函数、求余函数和符号函数,mod和rem的区别
  15. 阴阳师服务器维护结界卡暂停吗,阴阳师3月17日更新维护公告 全部更新内容汇总...
  16. 人脸识别、人证比对核验数据特点
  17. 【每日一题】P1551 亲戚
  18. 架构框架搭建(二)《Dubbo分布式领域驱动设计架构框体》
  19. 新生看过来!如何购机?电脑选购相关知识!
  20. HTML表格、长表格、表单

热门文章

  1. (自学笔记) 谭浩强 C语言程序设计 第五版 第二章:算法
  2. Nachos 用户进程地址分配
  3. 固定Vmware 虚拟机 系统时间
  4. 微信8.0.0中的[烟花]\[炸弹]原来还可以这样玩(JAVA脚本)程序员的快乐,很简单,快来看!!!
  5. CMOS电路中闩锁效应产生的原因、过程以及后果
  6. 代数——近世代数知识点思维导图(附Visio原文件)
  7. TensorFlow相关教程:使用tf.data加载图片
  8. 组态服务器和客户端是啥协议,组态王服务器和客户端区别
  9. xxx.dll没有被指定在windows上运行的解决方法
  10. 谷歌翻译接口_QTranslate:电脑全局翻译神器