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>();
//将我们自己申明的解析器和lualooper绑定起来,这样就可以让协程跑起来了
looper.luaState = luaState;
LuaCoroutine.Register(luaState, this); //lua协程注册,这样我们才能在Lua中使用tolua提供的协程函数
//Lua使用Unity中的类相关
LuaBinder.Bind(luaState);
}
/// <summary>
/// 调用解析器接口
/// </summary>
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
/// <summary>
/// 执行字符串形式的Lua语句
/// </summary>
/// <param name="str">要执行的Lua语句</param>
/// <param name="chunkName">执行出处</param>
public void DoString(string str, string chunkName = "LuaManager.cs")
{
luaState.DoString(str, chunkName);
}
/// <summary>
/// 执行指定名字的lua脚本
/// </summary>
/// <param name="fileName">要执行的lua脚本名</param>
public void Require(string fileName)
{
luaState.Require(fileName);
}
/// <summary>
/// 销毁当前使用的lua解析器
/// </summary>
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;

/// <summary>
/// 管理唯一的一个toLua解析器的管理器
/// </summary>
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; //将我们自己申明的解析器和lualooper绑定起来,这样就可以让协程跑起来了
LuaCoroutine.Register(luaState, this); //lua协程注册,这样我们才能在Lua中使用tolua提供的协程函数

LuaBinder.Bind(luaState); //Lua使用Unity中的类相关
}

/// <summary>
/// 调用解析器接口
/// </summary>
public LuaState LuaState
{
get => luaState;
}

/// <summary>
/// 执行字符串形式的Lua语句
/// </summary>
/// <param name="str">要执行的Lua语句</param>
/// <param name="chunkName">执行出处</param>
public void DoString(string str, string chunkName = "LuaManager.cs")
{
luaState.DoString(str, chunkName);
}

/// <summary>
/// 执行指定名字的lua脚本
/// </summary>
/// <param name="fileName">要执行的lua脚本名</param>
public void Require(string fileName)
{
luaState.Require(fileName);
}

/// <summary>
/// 销毁当前使用的lua解析器
/// </summary>
public void Dispose()
{
if (luaState == null)
return;
luaState.CheckTop();
luaState.Dispose();
luaState = null;
}
}