UH2S3L11——Lua调用数组、List和Dictionary

本章代码关键字

1
2
3
4
System.Array.CreateInstance()                                --创建数组
System.Collections.Generic.List_泛型参数() --创建列表,需要先在CustomSetting中去添加对应类型
System.Collections.Generic.Dictionary_键泛型参数_值泛型参数() --创建字典,需要先在CustomSetting中去添加对应类型
字典:TryGetValue() --尝试获取值,以字符串为键的的字典只能通过该方法获取值

Lua调用C#数组

假设我们要调用下面这个数组

1
2
3
4
public class Lesson3
{
public int[] array = new int[5] { 1, 2, 3, 4, 5 };
}
  • 访问数组的长度,直接使用Length​即可

    1
    2
    3
    -- 自定义类,需要在CustomSetting中去添加并生成
    local obj = Lesson3()
    print(obj.array.Length)

    image

  • 访问数组的元素,直接使用中括号,注意!C#的数组还是从0开始的!

    1
    print(obj.array[0])

    image

  • 查找元素位置

    1
    print("查找元素位置:" .. obj.array:IndexOf(2))

    image

  • 遍历数组

    注意!C#的数组还是从0开始的!

    1
    2
    3
    for i = 1, obj.array.Length - 1 do
    print("Array" .. obj.array[i])
    end

    image

    toLua比xLua多了几种遍历方式

    • 迭代器遍历

      1
      2
      3
      4
      local iter = obj.array:GetEnumerator()
      while iter:MoveNext() do
      print("iter: " .. iter.Current)
      end

      image

    • 数组转table遍历

      注意!将数组转为table后,就要按照lua的方式遍历,索引也从1开始

      1
      2
      3
      4
      local t = obj.array:ToTable()
      for i = 1, #t do
      print("table: " .. t[i])
      end

      image

  • 创建数组

    如果你是在Unity2021执行这一步,那么恭喜你,我们不能在Unity2021中直接用toLua去创建int数组了
    因为在Unity2021中,生成System.Int32​相关的代码会报错,而在不改动当前toLua的代码的情况下此问题无解

    1
    2
    3
    4
    5
    6
    local array2 = System.Array.CreateInstance(typeof(System.Int32), 10)
    print(array2.Length)
    print(array2[0])
    print(array2[1])
    array2[0] = 99
    print(array2[0])

    其中,System.Int32​需要在CustomSettings.cs中添加,并生成代码 (Unity2021生成会报错)

Lua调用C#List

假设我们要调用下面这个列表

1
2
3
4
public class Lesson3
{
public List<int> list = new List<int>();
}
  • 列表调用增删查成员方法,不要忘记用冒号!!!

    获取列表中的值正常传入索引即可

    1
    2
    3
    4
    5
    obj.list:Add(1)
    obj.list:Add(10)
    obj.list:Add(15)

    print(obj.list[2])

    image

  • 获取列表长度

    1
    print("长度:" .. obj.list.Count)

    image

  • 遍历列表,索引从1开始!!!

    1
    2
    3
    for i = 0, obj.list.Count - 1 do
    print("遍历:" .. obj.list[i])
    end

    image

  • 创建列表

    toLua中对泛型的支持比较糟糕,想要用什么泛型类型的对象,都需要在CustomSetting中去添加对应类型才能使用

    例如要创建List<string>​,就必须要到CustomSetting​的customTypeList​添加,再重新生成代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static class CustomSettings
    {
    //...
    public static BindType[] customTypeList =
    {
    //...
    _GT(typeof(List<string>)),
    //...
    }
    //...
    }

    完成上述步骤后,引用命名空间System.Collections.Generic​,使用固定写法List_string​来创建列表

    1
    2
    3
    local list2 = System.Collections.Generic.List_string()
    list2:Add("123")
    print(list2[0])

    image

Lua调用C#Dictionary

假设我们要调用下面这个字典

1
2
3
4
public class Lesson3
{
public Dictionary<int, string> dic = new Dictionary<int, string>();
}
  • 获取字典中的值正常传入键即可

    1
    2
    3
    4
    obj.dic:Add(1, "123")
    obj.dic:Add(2, "234")
    obj.dic:Add(3, "345")
    print(obj.dic[1])

    image

  • 遍历字典,toLua不能使用pairs去遍历字典,toLua中要用迭代器来进行遍历

    1
    2
    3
    4
    5
    local iter = obj.dic:GetEnumerator()
    while iter:MoveNext() do
    local v = iter.Current
    print(v.Key .. "_" .. v.Value)
    end

    image

    也可以单独遍历键或者值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -- 遍历键
    local keyIter = obj.dic.Keys:GetEnumerator()
    while keyIter:MoveNext() do
    print("键:" .. keyIter.Current)
    end

    -- 遍历值
    local valueIter = obj.dic.Values:GetEnumerator()
    while valueIter:MoveNext() do
    print("值:" .. valueIter.Current)
    end

    image

  • 字典的创建

    toLua中对泛型的支持比较糟糕,想要用什么泛型类型的对象,都需要在CustomSetting中去添加对应类型才能使用

    例如要创建List<string>​,就必须要到CustomSetting​的customTypeList​添加,再重新生成代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public static class CustomSettings
    {
    //...
    public static BindType[] customTypeList =
    {
    //...
    _GT(typeof(Dictionary<int, string>)),
    _GT(typeof(Dictionary<string, int>)),
    //...
    }
    //...
    }

    完成上述步骤后,引用命名空间System.Collections.Generic​,使用固定写法Dictionary_int_string​来创建列表

    1
    2
    3
    4
    print("创建Dic")
    local dic2 = System.Collections.Generic.Dictionary_int_string()
    dic2:Add(10, "123")
    print(dic2[10])

    image

    注意!toLua使用Dictionary不能直接通过字符串作为键来访问值,否则会报错
    需要调用TryGetValue()​这种方法

    1
    2
    3
    4
    5
    local dic3 = System.Collections.Generic.Dictionary_string_int()
    dic3:Add("123", 88888)
    -- print(dic3["123"]) --会报错
    local b, v = dic:TryGetValue("123", nil)
    print(v)

    image