UH2S3L11——Lua调用数组、List和Dictionary
UH2S3L11——Lua调用数组、List和Dictionary
本章代码关键字
1 | System.Array.CreateInstance() --创建数组 |
Lua调用C#数组
假设我们要调用下面这个数组
1 | public class Lesson3 |
-
访问数组的长度,直接使用
Length
即可1
2
3-- 自定义类,需要在CustomSetting中去添加并生成
local obj = Lesson3()
print(obj.array.Length)
-
访问数组的元素,直接使用中括号,注意!C#的数组还是从0开始的!
1
print(obj.array[0])
-
查找元素位置
1
print("查找元素位置:" .. obj.array:IndexOf(2))
-
遍历数组
注意!C#的数组还是从0开始的!
1
2
3for i = 1, obj.array.Length - 1 do
print("Array" .. obj.array[i])
end
toLua比xLua多了几种遍历方式
-
迭代器遍历
1
2
3
4local iter = obj.array:GetEnumerator()
while iter:MoveNext() do
print("iter: " .. iter.Current)
end
-
数组转table遍历
注意!将数组转为table后,就要按照lua的方式遍历,索引也从1开始
1
2
3
4local t = obj.array:ToTable()
for i = 1, #t do
print("table: " .. t[i])
end
-
-
创建数组
如果你是在Unity2021执行这一步,那么恭喜你,我们不能在Unity2021中直接用toLua去创建int数组了
因为在Unity2021中,生成System.Int32
相关的代码会报错,而在不改动当前toLua的代码的情况下此问题无解1
2
3
4
5
6local 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 | public class Lesson3 |
-
列表调用增删查成员方法,不要忘记用冒号!!!
获取列表中的值正常传入索引即可
1
2
3
4
5obj.list:Add(1)
obj.list:Add(10)
obj.list:Add(15)
print(obj.list[2])
-
获取列表长度
1
print("长度:" .. obj.list.Count)
-
遍历列表,索引从1开始!!!
1
2
3for i = 0, obj.list.Count - 1 do
print("遍历:" .. obj.list[i])
end
-
创建列表
toLua中对泛型的支持比较糟糕,想要用什么泛型类型的对象,都需要在
CustomSetting
中去添加对应类型才能使用例如要创建
List<string>
,就必须要到CustomSetting
的customTypeList
添加,再重新生成代码1
2
3
4
5
6
7
8
9
10
11public static class CustomSettings
{
//...
public static BindType[] customTypeList =
{
//...
_GT(typeof(List<string>)),
//...
}
//...
}完成上述步骤后,引用命名空间
System.Collections.Generic
,使用固定写法List_string
来创建列表1
2
3local list2 = System.Collections.Generic.List_string()
list2:Add("123")
print(list2[0])
Lua调用C#Dictionary
假设我们要调用下面这个字典
1 | public class Lesson3 |
-
获取字典中的值正常传入键即可
1
2
3
4obj.dic:Add(1, "123")
obj.dic:Add(2, "234")
obj.dic:Add(3, "345")
print(obj.dic[1])
-
遍历字典,toLua不能使用pairs去遍历字典,toLua中要用迭代器来进行遍历
1
2
3
4
5local iter = obj.dic:GetEnumerator()
while iter:MoveNext() do
local v = iter.Current
print(v.Key .. "_" .. v.Value)
end
也可以单独遍历键或者值
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
-
字典的创建
toLua中对泛型的支持比较糟糕,想要用什么泛型类型的对象,都需要在
CustomSetting
中去添加对应类型才能使用例如要创建
List<string>
,就必须要到CustomSetting
的customTypeList
添加,再重新生成代码1
2
3
4
5
6
7
8
9
10
11
12public 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
4print("创建Dic")
local dic2 = System.Collections.Generic.Dictionary_int_string()
dic2:Add(10, "123")
print(dic2[10])
注意!toLua使用Dictionary不能直接通过字符串作为键来访问值,否则会报错
需要调用TryGetValue()
这种方法1
2
3
4
5local dic3 = System.Collections.Generic.Dictionary_string_int()
dic3:Add("123", 88888)
-- print(dic3["123"]) --会报错
local b, v = dic:TryGetValue("123", nil)
print(v)