使用自定义lua解析管理器调用lua脚本中的table

[5] 使用自定义lua解析管理器调用table

访问数组类型的table

CallLuaEntrance测试脚本中内容:

C# 复制代码
 //--------------------------------------访问table-----------------------------
//4.1 访问list/数组类型的table
//获取table
LuaTable luaTable = CallLuaManager.Instance().LuaState.GetTable("arrayTable");
//直接访问
Debug.Log("luaTable[1] " + luaTable[1]);
Debug.Log("luaTable[2] " + luaTable[2]);
Debug.Log("luaTable[3] " + luaTable[3]);
Debug.Log("luaTable[4] " + luaTable[4]);
Debug.Log("luaTable[5] " + luaTable[5]);
Debug.Log("luaTable[6] " + luaTable[6]);
Debug.Log("luaTable[7] " + luaTable[7]);

//转成array存储访问
Object[] array = luaTable.ToArray();
for (int i = 0; i < array.Length; i++)
{
    Debug.Log("listTable遍历访问 " + array[i]);
}

//检测是否是深拷贝
//更改最后一个数值
luaTable[7] = 9999;
Debug.Log("-------------->luaTable[7] " + luaTable[7]);
//获取arrayTable2 
luaTable = CallLuaManager.Instance().LuaState.GetTable("arrayTable2");

Object[] array2 = luaTable.ToArray();
for (int i = 0; i < array2.Length; i++)
{
    Debug.Log("listTable遍历访问" + array2[i]);
}

对应的lua内容:

lua 复制代码
--list/数组类型的table
arrayTable = {2024,05,10,19,55,66,78}

arrayTable2 = {"Hello","Lua",ture,123,88.88}

访问DIctionary类型的table

在C#脚本中使用LuaTable来接受获取到的Table,对于字典类型的Table调用LuaTable的ToDictTable方法转成对应类型的LuaDictTable

类型,获取字典的迭代器对字典进行迭代遍历。

CallLuaEntrance测试脚本中内容:

C# 复制代码
 //4.2 字典类型的table数值获取
 luaTable = CallLuaManager.Instance().LuaState.GetTable("dicTable1");
 Debug.Log("luaTable[\"date\"] " + luaTable["date"]);
 Debug.Log("luaTable[\"name\"] " + luaTable["name"]);
 Debug.Log("luaTable[\"blog\"] " + luaTable["blog"]);
 Debug.Log("luaTable[\"WebBlog\"] " + luaTable["WebBlog"]);


luaTable = CallLuaManager.Instance().LuaState.GetTable("dicTable2");
//转成LuaDictTable
// 因为键值对 各自的类型不统一 因此使用object 
// 如果类型统一可以使用已知的
LuaDictTable<object, object> luaDictionary = luaTable.ToDictTable<Object, Object>();
Debug.Log("dictionary[true] = " + luaDictionary[true]);

//通过迭代器遍历
IEnumerator<LuaDictEntry<object, object>> enumerable = luaDictionary.GetEnumerator();

while (enumerable.MoveNext())
{
Debug.Log(enumerable.Current.Key + "  ,  " + enumerable.Current.Value);
}

访问的lua脚本中数据:

lua 复制代码
--Dictionary类型的table
dicTable1 = {
	["date"] = "2024/05/10",
	["name"] = "TonyChang",
	["blog"] = "TonyCode",
	["WebBlog"] = "cnblogs",
}

dicTable2 = {
	[12] = 666,
	[true] = 1,
    [20.01] = "Yes!",
	["tony"] = "geeks",
}

最后总结一下:

在C#中调用lua中的Table和函数,就是先使用LuaState中方法获取到对应的函数或者table,之后根据获取的类型进行对应的解析访问。

一般我们调用一个具体的函数或者table时候,已经清楚其对应的类型,可以根据对应类型将table具体转换,之后访问使用。

此外发现,luaTable中的是浅拷贝(索引指向同一个数值),即在获取到的luaTable中更改数值其原数值也会改变。