[5] 使用自定義lua解析管理器呼叫table
訪問陣列型別的table
CallLuaEntrance測試指令碼中內容:
//--------------------------------------訪問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內容:
--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測試指令碼中內容:
//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指令碼中資料:
--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中更改數值其原數值也會改變。