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

本章代码关键字

1
2
3
4
5
6
CS.System.Array.CreateInstance()            --创建数组
CS.System.Collections.Generic.List() --创建列表,之后还需要再实例化才可用
CS.System.Collections.Generic.Dictionary() --创建字典,之后还需要再实例化才可用
字典:get_Item() --通过键获取值,在Lua里创建的字典只能用该方法
字典:set_Item() --对键设置值,在Lua里创建的字典只能用该方法
字典:TryGetValue() --尝试获取值,第一个返回的是是否成功获取值,第二个返回的是具体的值

调用数组

先在C#脚本内声明如下内容

1
2
3
4
5
6
public class Lesson3
{
public int[] array = new int[5] { 1, 2, 3, 4, 5 };
public List<int> list = new List<int>();
public Dictionary<int, string> dic = new Dictionary<int, string>();
}

调用长度

对于数组长度的获取,C#怎么用,lua就怎么用,不能使用#​去获取长度,因为这里实际上在使用C#的数组对象,而非Lua的表

1
2
local obj = CS.Lesson3()
print(obj.array.Length)

访问元素

访问元素就直接使用[索引]​即可,需要注意,由于使用的是C#的数组而非Lua的,因此索引照样从0开始!

1
print(obj.array[0])

image

遍历数组

如果要遍历数组,需要注意,由于使用的是C#的数组而非Lua的,因此索引照样从0开始,同样的,for循环的最大值填入长度时也需要减1

image

Lua创建C#数组

这里的创建数组和Lua声明表不同,创建是创建C#中的数组 使用Array类中的静态方法CreateInstance​即可
第一个参数传入要创建数组的类型,第二个参数传入数组长度

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

image

调用List

添加元素

Add​是成员方法,因此调用必须用冒号!!!!!!

1
2
3
obj.list:Add(1)
obj.list:Add(2)
obj.list:Add(3)

获取长度与遍历

和数组的使用方法一样

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

image

Lua创建C#List

老版本

需要引用列表相关的命名空间System.Collections.Generic​,再通过索引["List1[命名空间.类型]"]`​,其中1是泛型的参数个数

1
2
3
4
local list2 = CS.System.Collections.Generic["List`1[System.String]"]()
print(list2)
list2:Add("123")
print(list2[0])

image

新版本

XLua版本大于2.1.12时,可以使用更简单的方法

首先使用CS.System.Collections.Generic.List(CS.命名空间.类型)​,创建对应的类
再通过这个类实例化创建列表

1
2
3
4
local List_String = CS.System.Collections.Generic.List(CS.System.String)
local list3 = List_String()
list3:Add("5555555")
print(list3)

image

调用Dictionary

使用仍然和C#的字典一致,但是要注意,成员方法同样要使用冒号:​调用

1
2
obj.dic:Add(1, "123")
print(obj.dic[1])

遍历字典

这里的遍历就一定要使用pairs的for循环

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

for key, value in pairs(obj.dic) do
print(key, value)
end

image

Lua创建C#字典

这里只介绍新版本的实例化方法,和上面的List新版本创建大致相同

1
2
3
4
5
6
7
local Dic_String_Vector3 = CS.System.Collections.Generic.Dictionary(CS.System.String, CS.UnityEngine.Vector3)
local dic2 = Dic_String_Vector3()
dic2:Add("123", CS.UnityEngine.Vector3.right)
for key, value in pairs(dic2) do
print(key, value)
end
print(dic2["123"])

image

虽然遍历没有出现问题,但是很明显,在Lua中创建的字典,直接通过 [键] 去获取值是得不到的
我们必须要通过一个固定的成员方法****​字典:get_Item(键)
获取,同样的,设置值也需要****​字典:get_Item(键, 值)

1
2
3
4
print(dic2["123"])
print(dic2:get_Item("123"))
dic2:set_Item("123", nil)
print(dic2:get_Item("123"))

image

TryGetValue

TryGetValue​的第一个返回值是是否存在值,第二个返回值才是具体的值,对在原本在C#中的字典与在Lua中创建的字典都可用

1
2
print(dic2["123"])
print(dic2:TryGetValue("123"))

image