UH2S2L10——表映射到LuaTable

本章代码关键字

1
2
3
4
LuaTable                //可以用于映射Lua中表的一种类,是引用拷贝,建议少用,因为会产生垃圾
luaTable.Get<>() //获取表中的变量
luaTable.Set<>() //修改表中的变量,会影响Lua中的表的值
luaTable.Dispose() //销毁luaTable,若不销毁,则将一直占用内存!

LuaTable

我们在C#脚本里调用Lua解析器的_G​表时,其实我们就是在对其返回的LuaTable​操作
同样的,我们可以用LuaTable​来获取Lua中的表

先在Lua脚本声明如下内容

1
2
3
4
5
6
7
8
9
TestClass = {
testInt = 2,
testBool = true,
testFloat = 1.2,
testString = "123",
testFun = function()
print("123123123")
end,
} -- 用表模拟的类

再通过LuaTable​来获取Lua中的表

1
2
3
4
5
6
7
8
9
LuaManager.Instance.Init();
LuaManager.Instance.DoLuaFile("Main");

LuaTable table = LuaManager.Instance.Global.Get<LuaTable>("TestClass");
Debug.Log(table.Get<int>("testInt"));
Debug.Log(table.Get<bool>("testBool"));
Debug.Log(table.Get<float>("testFloat"));
Debug.Log(table.Get<string>("testString"));
table.Get<LuaFunction>("testFun").Call();

image

使用LuaTable​映射表很方便,不需要我们去声明任何东西就可以使用
但是,官方并不推荐使用LuaTable​,原因与LuaFunction​一致,它们会产生垃圾,效率低

我们之前就可以对的_G​表的LuaTable​通过Set​方法来修改全局变量,
不难发现LuaTable​和接口映射一样是引用拷贝,即通过它修改表中的值会对Lua中的表产生影响

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LuaManager.Instance.Init();
LuaManager.Instance.DoLuaFile("Main");

LuaTable table = LuaManager.Instance.Global.Get<LuaTable>("TestClass");
Debug.Log(table.Get<int>("testInt"));
Debug.Log(table.Get<bool>("testBool"));
Debug.Log(table.Get<float>("testFloat"));
Debug.Log(table.Get<string>("testString"));
table.Get<LuaFunction>("testFun").Call();

table.Set("testInt", 55);
Debug.Log(table.Get<int>("testInt"));

LuaTable table2 = LuaManager.Instance.Global.Get<LuaTable>("TestClass");
Debug.Log(table2.Get<int>("testInt"));

image

LuaTable的销毁

LuaTable​的调用完毕时,应当手动销毁,否则将一直占用内存,造成内存泄露,LuaFunction​同理
Lua解析器的tick()​就是会释放我们没有手动销毁的LuaTable​,LuaFunction

1
2
table.Dispose();
table2.Dispose();