UH2S2L4——Lua解析器管理器
Lua解析器管理器要做的工作
封装管理唯一的Lua解析器,对外开放调用Lua解析器接口,实现自定义加载脚本规则,实现直接执行lua脚本的方法
继承单例模式基类
这里让ABManager
继承了单例模式基类BaseManager<T>
,作为单例模式管理器使用
基础成员与属性、初始化方法
- 由于Lua解析器一般是唯一的,因此使用一个私有成员变量
luaEnv
来管理这个唯一的Lua解析器
- 因为以后外部会经常调用Lua解析器的
_G
表,因此使用开放只读属性Global
使外部可以方便的调用
- 初始化方法会在解析器为空时实例化解析器,并将自定义加载脚本的方法添加到解析器里
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| private LuaEnv luaEnv;
public LuaTable Global { get { if (luaEnv == null) { Debug.LogError("Lua解析器未初始化!"); return null; } return luaEnv.Global; } }
public void Init() { if (luaEnv != null) return; luaEnv = new LuaEnv(); luaEnv.AddLoader(CustomDebugLoader); luaEnv.AddLoader(CustomABLoader); }
|
自定义加载脚本方法
声明了两个自定义加载脚本方法,一个用于开放调试时读取,另一个用于打包后读取
-
CustomDebugLoader
用于开发中读取,可以直接读取工程下的Lua文件夹下的脚本,且不需要加.txt后缀名,打包后不可用!
-
CustomABLoader
用于打包后读取,调用了之前实现的AB包管理器,读取luaAB包的脚本,需要加.txt后缀名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| private byte[] CustomDebugLoader(ref string filePath) { string path = Application.dataPath + "/Lua/" + filePath + ".lua"; if (File.Exists(path)) { return File.ReadAllBytes(path); } else { Debug.Log("CustomDebugLoader重定向失败,文件名为: " + filePath); } return null; }
private byte[] CustomABLoader(ref string filePath) { TextAsset luaScript = ABManager.Instance.LoadRes<TextAsset>("lua", filePath + ".lua"); if (luaScript != null) return luaScript.bytes; else Debug.Log("CustomABLoader重定向失败,文件名: " + filePath); return null; }
|
封装Lua解析器方法
封装并对外开放一系列调用唯一Lua解析器的方法
- 执行lua语句,释放垃圾,销毁解析器方法都封装了,并添加了判空逻辑
- 添加
DoLuaFile
方法,传入脚本名可直接执行lua脚本,让外部不再需要执行DoString("require('脚本名')")
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
public void DoLuaFile(string fileName) { string str = string.Format("require('{0}')", fileName); DoString(str); }
public void DoString(string str) { if (luaEnv == null) { Debug.LogError("Lua解析器未初始化!"); return; } luaEnv.DoString(str); }
public void Tick() { if (luaEnv == null) { Debug.LogError("Lua解析器未初始化!"); return; } luaEnv.Tick(); }
public void Dispose() { if (luaEnv == null) { Debug.LogError("Lua解析器未初始化!"); return; } luaEnv.Dispose(); luaEnv = null; }
|
管理器代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| using System.IO; using UnityEngine; using XLua;
public class LuaManager : ManagerBase<LuaManager> { private LuaEnv luaEnv;
public LuaTable Global { get { if (luaEnv == null) { Debug.LogError("Lua解析器未初始化!"); return null; } return luaEnv.Global; } }
public void Init() { if (luaEnv != null) return; luaEnv = new LuaEnv(); luaEnv.AddLoader(CustomDebugLoader); luaEnv.AddLoader(CustomABLoader); }
public void DoLuaFile(string fileName) { string str = string.Format("require('{0}')", fileName); DoString(str); }
public void DoString(string str) { if (luaEnv == null) { Debug.LogError("Lua解析器未初始化!"); return; } luaEnv.DoString(str); }
public void Tick() { if (luaEnv == null) { Debug.LogError("Lua解析器未初始化!"); return; } luaEnv.Tick(); }
public void Dispose() { if (luaEnv == null) { Debug.LogError("Lua解析器未初始化!"); return; } luaEnv.Dispose(); luaEnv = null; }
private byte[] CustomDebugLoader(ref string filePath) { string path = Application.dataPath + "/Lua/" + filePath + ".lua"; if (File.Exists(path)) { return File.ReadAllBytes(path); } else { Debug.Log("CustomDebugLoader重定向失败,文件名为: " + filePath); } return null; }
private byte[] CustomABLoader(ref string filePath) { TextAsset luaScript = ABManager.Instance.LoadRes<TextAsset>("lua", filePath + ".lua"); if (luaScript != null) return luaScript.bytes; else Debug.Log("CustomABLoader重定向失败,文件名: " + filePath); return null; } }
|