这一部分主要讲的是如何在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#中是一致的,,,,,,,

效果截图如下:

lua里面模仿枚举 lua 枚举类型_编程

顺便说一句的,C#中的NULL在lua中会被识别成nil,这样就方便了lua中对于NULL的检测


案例10:

lua访问C#中的枚举类型

这个案例中所访问的枚举类型是UnityEngine中自带的Space类型

lua里面模仿枚举 lua 枚举类型_dictionary_02

核心代码如下:

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:  枚举变量 = 枚举类型.枚举值


效果截图如下:

lua里面模仿枚举 lua 枚举类型_Tolua#_03

基本上就是这些了,这些Tolua#的枚举变量相关的方法相比于之前的ulua,有了一定的扩充,使用上感觉较之前的方便了很多~~~

然后让我们下章再见