Unity Xlua 之 C#调用Lua(一)
一.Lua解析器(LuaEnv)
执行Lua代码,加载Lua文件执行
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13public class Lesson01_LuaEnv : MonoBehaviour { private LuaEnv _luaEnv; private void Start() { _luaEnv = new LuaEnv(); _luaEnv.DoString("print('Unity!')"); _luaEnv.DoString("require('Main')");//默认从Resources文件夹下加载,且文件格式为xxx.lua.txt _luaEnv.Tick();//类似C#清理没有引用的变量内存 _luaEnv.Dispose();//释放掉Lua虚拟机环境 } }
二.文件加载重定向
XLua加载Lua脚本默认是从Resources文件夹下加载,由于Unity对文件的读取性质,不能对后缀名称为.lua的文件进行读取,所以需要使用xxx.lua.txt。但是这样不能进行热更新Lua代码,而且开发起来不方便,所以需要重定向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
26public class Lesson02_Loader : MonoBehaviour { private LuaEnv _luaEnv; private void Start() { _luaEnv = new LuaEnv(); _luaEnv.AddLoader(CustomLoader);//可以有多个Loader,依次加载,直到加载成功,否则执行默认的Loader进行加载 _luaEnv.DoString("require('Main')"); _luaEnv.Dispose(); } private byte[] CustomLoader(ref string filePath) { var path = Application.dataPath + "/Lua/" + filePath + ".lua"; if (File.Exists(path)) { return File.ReadAllBytes(path); } else { Debug.Log("文件:"+path+"不存在!!!"); } return null; } }
三.Lua解析器管理器
在项目中多处地方需要使用LuaEnv,并且项目中的Lua文件是放在AB包中进行读取(AB包中只允许.txt的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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51public class LuaMgr : BaseManager<LuaMgr> { private LuaEnv _luaEnv; public LuaTable Global => _luaEnv.Global; public void Init() { if(_luaEnv!=null) return; _luaEnv = new LuaEnv(); _luaEnv.AddLoader(CustomLoader); _luaEnv.AddLoader(CustomABLoader); } private byte[] CustomLoader(ref string filePath) { var path = Application.dataPath + "/Lua/" + filePath + ".lua"; if (File.Exists(path)) { return File.ReadAllBytes(path); } else { Debug.Log("文件:"+path+"不存在!!!"); } return null; } private byte[] CustomABLoader(ref string filePath) { var lua = ABMgr.GetInstance().LoadRes<TextAsset>("lua",filePath+".lua"); return lua != null ? lua.bytes : null; } public void DoString(string str) { _luaEnv?.DoString(str); } public void LoadFile(string fileName) { DoString($"require('{fileName}')"); } public void Tick() { _luaEnv?.Tick(); } public void Dispose() { if(_luaEnv==null) return; _luaEnv.Dispose(); _luaEnv = null; } }
测试代码
复制代码
1
2
3
4
5
6
7
8
9
10public class Lesson03_LuaMgr : MonoBehaviour { private void Start() { LuaMgr.GetInstance().Init(); LuaMgr.GetInstance().LoadFile("Main"); } }
最后
以上就是冷酷曲奇最近收集整理的关于Unity Xlua 之 C#调用Lua(一)Unity Xlua 之 C#调用Lua(一)的全部内容,更多相关Unity内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复