这一部分主要讲的是如何在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,有了一定的扩充,使用上感觉较之前的方便了很多~~~
然后让我们下章再见