這一部分主要講的是如何在lua代碼中訪問C#中的Dictionary對象與枚舉類型,相比之之前的算是比較簡單的了,基本上看一下就完全會使用了
案例9:
lua訪問C#中的Dictionary
首先:作者也說過,對於這個例子中的方法BindMap()方法無需可以關注,這個只是爲了保證例子可以獨立運行,平時的開發中只需要將需要的類型添加在在CustomSetting的列表之中即可。
核心代碼比較少:
function TestDict(map)
local iter = map:GetEnumerator()
while iter:MoveNext() do
local v = iter.Current.Value
print('id: '..v.id ..' name: '..v.name..' sex: '..v.sex)
end
end
這裏lua函數中傳入的map就是C#中的Dictionary對象,我們可以通過Dictionary對象的GetEnumerator方法獲取到該對象的枚舉計數器,然後通過調用該iter.Current.value則可以訪問到枚舉計數器所指向的值,可以使用iter:MoveNext()來是枚舉計數器訪問下一個元素,在lua中,iter:MoveNext()在訪問越界時會返回一個nil,所以可以通過以上的結構來遍歷C#中的Dictionary。
除了以上的接口,筆者驗證過C#中的Dictionary的大多數方法也可以在lua中以正常使用,需要記得的是類成員方法調用時是
: 而不是 .
這裏還是給個詳細列表來湊個長度吧:
Dictionary:get_Item() --獲取與指定的鍵相關聯的值
Dictionary:set_Item() --設置與指定的鍵相關聯的值
Dictionary:Add() --將指定的鍵和值添加到字典中
Dictionary:Clear() --從 Dictionary中移除所有的鍵和值
Dictionary:ContainsKey() --確定 Dictionary是否包含指定的鍵
Dictionary:ContainsValue() --確定 Dictionary是否包含特定值
Dictionary:GetObjectData()
Dictionary:OnDeserialization()
Dictionary:Remove() --從 Dictionary中移除所指定的鍵的值
Dictionary:TryGetValue() --獲取與指定的鍵相關聯的值
Dictionary:GetEnumerator() --返回循環訪問 Dictionary的枚舉數
Dictionary:New() --這個是創建一個字典的方法
Dictionary.this --對象的this引用
Dictionary.__tostring --返回表示當前 Object的 String,這裏其實並非C#對象的那個Tostring().而是作者自己重新等裝的,但是效果類似,不用糾結,
--只不過不是方法而是對象了
Dictionary.Count --獲取包含在 Dictionary中的鍵/值對的數
Dictionary.Comparer --獲取用於確定字典中的鍵是否相
Dictionary.Keys --獲取包含 Dictionary中的鍵的集合
Dictionary.Values --獲取包含 Dictionary中的值的集合
~~~這裏的方法的參數列表我就不給了哈,和C#中是一致的,,,,,,,
效果截圖如下:
順便說一句的,C#中的NULL在lua中會被識別成nil,這樣就方便了lua中對於NULL的檢測
案例10:
lua訪問C#中的枚舉類型
這個案例中所訪問的枚舉類型是UnityEngine中自帶的Space類型
核心代碼如下:
string script =
@"
space = nil
function TestEnum(e)
print('Enum is:'..tostring(e))
if space:ToInt() == 0 then
print('enum ToInt() is ok')
end
if not space:Equals(0) then
print('enum compare int is ok')
end
if space == e then
print('enum compare enum is ok')
end
local s = UnityEngine.Space.IntToEnum(0)
if space == s then
print('IntToEnum change type is ok')
end
end
function ChangeLightType(light, type)
print('change light type to Directional')
light.type = UnityEngine.LightType.Directional
end
";
void Start ()
{
LuaState state = new LuaState();
state.Start();
LuaBinder.Bind(state);
state.DoString(script);
state["space"] = Space.World;
LuaFunction func = state.GetFunction("TestEnum");
func.BeginPCall();
func.Push(Space.World);
func.PCall();
func.EndPCall();
func.Dispose();
func = null;
GameObject go = GameObject.Find("/Light");
Light light = go.GetComponent<Light>();
func = state.GetFunction("ChangeLightType");
func.BeginPCall();
func.Push(light);
func.Push(LightType.Directional);
func.PCall();
func.EndPCall();
func.Dispose();
func = null;
state.CheckTop();
state.Dispose();
state = null;
}
主要的方法如下:
tostring(枚舉變量) 可以輸出該枚舉變量的變量名
枚舉變量:ToInt() 可以將枚舉變量轉化爲對應的整數
枚舉類型.IntToEnum() 可以將整數轉化爲對應的枚舉變量
枚舉變量:Equals(整數) 可以實現整數與枚舉變量的比較
2個枚舉變量之間可以直接使用 == 來判斷是否相等
並可以直接賦值
分爲2種:
1: 枚舉變量 = 枚舉變量
2: 枚舉變量 = 枚舉類型.枚舉值
效果截圖如下:
基本上就是這些了,這些Tolua#的枚舉變量相關的方法相比於之前的ulua,有了一定的擴充,使用上感覺較之前的方便了很多~~~
然後讓我們下章再見