UH2S3L4——toLua解析器管理器
Lua解析器管理器要做的工作
封装管理唯一的toLua解析器,对外开放调用Lua解析器接口,在打包后可调用自定义解析规则,实现直接执行lua脚本的方法
继承单例模式基类
这里让ABManager
继承了单例模式基类BaseManager<T>
,作为单例模式管理器使用
基础成员与属性、初始化方法
- 由于toLua解析器一般是唯一的,因此使用一个私有成员变量
luaState
来管理这个唯一的toLua解析器
- 因为以后外部会经常调用
luaState
(主要是调用_G
表内内容),因此开放只读属性LuaState
使外部可以方便的调用
- 初始化方法会在解析器为空时实例化解析器,在打包后可调用自定义解析规则
- 初始化方法中需要初始化
DelegateFactory
,执行DelegateFactory.Init()
,以便于正常使用委托
- 初始化方法中需要让
LuaLooper
挂载到自己的游戏对象上,并将管理的LuaState
关联到其luaState
属性上,以便于正常使用Lua协程
- 初始化方法中需要注册Lua协程,执行
LuaCoroutine.Register()
,传入当前Lua解析器,以及依附于GameObject上的脚本
- 初始化方法中需要执行
LuaBinder.Bind()
,传入当前的Lua解析器,才能让Lua执行Unity类相关代码
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
| private LuaState luaState;
public void Init() { if (luaState != null) return; #if !UNITY_EDITOR new LuaCustomLoader(); #endif luaState = new LuaState(); luaState.Start();
DelegateFactory.Init(); LuaLooper looper = this.gameObject.AddComponent<LuaLooper>(); looper.luaState = luaState; LuaCoroutine.Register(luaState, this); LuaBinder.Bind(luaState); }
public LuaState LuaState { get => luaState; }
|
封装Lua解析器方法
封装并对外开放一系列调用唯一toLua解析器的方法
- 执行lua语句,销毁解析器方法都封装了,并添加了判空逻辑
- 添加
Require
方法,传入脚本名可直接执行lua脚本
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
|
public void DoString(string str, string chunkName = "LuaManager.cs") { luaState.DoString(str, chunkName); }
public void Require(string fileName) { luaState.Require(fileName); }
public void Dispose() { if (luaState == null) return; luaState.CheckTop(); luaState.Dispose(); luaState = 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
| using LuaInterface;
public class LuaManager : SingletonAutoMonoBehaviour<LuaManager> { private LuaState luaState;
public void Init() { if (luaState != null) return; #if !UNITY_EDITOR new LuaCustomLoader(); #endif luaState = new LuaState(); luaState.Start();
DelegateFactory.Init(); LuaLooper looper = this.gameObject.AddComponent<LuaLooper>(); looper.luaState = luaState; LuaCoroutine.Register(luaState, this);
LuaBinder.Bind(luaState); }
public LuaState LuaState { get => luaState; }
public void DoString(string str, string chunkName = "LuaManager.cs") { luaState.DoString(str, chunkName); }
public void Require(string fileName) { luaState.Require(fileName); }
public void Dispose() { if (luaState == null) return; luaState.CheckTop(); luaState.Dispose(); luaState = null; } }
|