使用自定義lua解析管理器呼叫lua指令碼中的table

畅知發表於2024-05-10

[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中更改數值其原數值也會改變。

相關文章