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
/// <summary>
/// 执行lua脚本
/// </summary>
/// <param name="fileName">要执行的脚本名</param>
public void DoLuaFile(string fileName)
{
string str = string.Format("require('{0}')", fileName);
DoString(str);
}

/// <summary>
/// 执行Lua语句
/// </summary>
/// <param name="str">要执行的Lua语句</param>
public void DoString(string str)
{
if (luaEnv == null)
{
Debug.LogError("Lua解析器未初始化!");
return;
}
luaEnv.DoString(str);
}

/// <summary>
/// 释放Lua垃圾
/// </summary>
public void Tick()
{
if (luaEnv == null)
{
Debug.LogError("Lua解析器未初始化!");
return;
}
luaEnv.Tick();
}

/// <summary>
/// 销毁解析器
/// </summary>
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;

/// <summary>
/// Lua管理器,提供Lua解析器
/// </summary>
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);
}

/// <summary>
/// 执行lua脚本
/// </summary>
/// <param name="fileName">要执行的脚本名</param>
public void DoLuaFile(string fileName)
{
string str = string.Format("require('{0}')", fileName);
DoString(str);
}

/// <summary>
/// 执行Lua语句
/// </summary>
/// <param name="str">要执行的Lua语句</param>
public void DoString(string str)
{
if (luaEnv == null)
{
Debug.LogError("Lua解析器未初始化!");
return;
}
luaEnv.DoString(str);
}

/// <summary>
/// 释放Lua垃圾
/// </summary>
public void Tick()
{
if (luaEnv == null)
{
Debug.LogError("Lua解析器未初始化!");
return;
}
luaEnv.Tick();
}

/// <summary>
/// 销毁解析器
/// </summary>
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;
}
}