14.Lua调用CSharp-数据集合
14.1 知识点
准备工作
LuaManager.Instance.Init();
LuaManager.Instance.DoLuaFile("Lesson14_Lua调用CSharp_数据集合");
基本方法概述
对于数据集合的使用方法
在 C# 中如何使用数据集合,在 Lua 中就使用对应的 C# 方法,而不遵循 Lua 的语法规则,除非 Lua 完全无法使用对应的 C# 方法。
准备用于测试的各种数据集合的类
public class Lesson14_TestDataCollectionsClass
{
public int[] array = new int[5] { 1, 2, 3, 4, 5 };
public List<int> list = new List<int>();
public Dictionary<int, string> dictionary = new Dictionary<int, string>();
}
实例化测试数据集合类
local testDataCollectionsClass = CS.Lesson14_TestDataCollectionsClass()
数组
数组长度:数组.Length 不能使用#去获取长度
print(testDataCollectionsClass.array.Length) -- 5
访问元素:数组[索引]
print(testDataCollectionsClass.array[0]) -- 1
修改元素:数组[索引] = 新值
testDataCollectionsClass.array[0] = 111
print(testDataCollectionsClass.array[0]) -- 111
遍历数组:从 0 开始到数组长度 - 1 结束,遵循 C# 规则
-- 虽然lua中的索引从1开始 但是因为使用的是C#数组 不遵循Lua的语法规则
for i = 0, testDataCollectionsClass.array.Length - 1 do
print(testDataCollectionsClass.array[i])
end
创建数组对象:使用系统的数组类的 CreateInstance 方法,传入元素类型和初始化长度
--数组的本质是系统定义好的类
local myArray = CS.System.Array.CreateInstance(typeof(CS.System.Int32), 10)
print(myArray.Length) --10
print(myArray[0]) --0
myArray[1] = 1
print(myArray[1]) --1
数组内存地址:直接 print(数组)
print(myArray) -- LUA: System.Int32[]: 1396501760
List
添加 List 元素:调用 List 的成员方法 Add,注意成员方法要使用 : 调用
testDataCollectionsClass.list:Add(1)
testDataCollectionsClass.list:Add(2)
testDataCollectionsClass.list:Add(3)
得到 List 元素:List[索引]
print(testDataCollectionsClass.list[0])
List 长度:List.Count
print(testDataCollectionsClass.list.Count) -- 3
遍历 List:从 0 开始到数组长度 - 1 结束,遵循 C# 规则
for i = 0, testDataCollectionsClass.list.Count - 1 do
print(testDataCollectionsClass.list[i])--1 2 3
end
修改 List 元素:List[索引] = 新值
testDataCollectionsClass.list[0] = 111
print(testDataCollectionsClass.list[0]) -- 111
移除 List 元素:调用 List 的成员方法 Remove,注意成员方法要使用 : 调用
testDataCollectionsClass.list:Remove(1)
for i = 0, testDataCollectionsClass.list.Count - 1 do
print(testDataCollectionsClass.list[i])--2 3
end
List 内存地址:直接 print(List)
print(testDataCollectionsClass.list) -- LUA: System.Collections.Generic.List`1[System.Int32]: 569280896
创建List对象 xLua老版本(xLua版本<=v2.1.12)
-- 先通过 CS.System.Collections.Generic["List`1[类名]"] 相当于C#得到 List<类名> 类
local List_String1 = CS.System.Collections.Generic["List`1[System.String]"]
-- 再通过()实例化List对象
local myList1 = List_String1()
--其实也可以一步到位
myList1 = CS.System.Collections.Generic["List`1[System.String]"]()
--添加List元素
myList1:Add("我是xLua老版本创建的List")
print(myList1[0])--我是xLua老版本创建的List
--List内存地址
print(myList1)--LUA: System.Collections.Generic.List`1[System.String]: 1967029376
创建Lis对象 xLua新版本(xLua版本>v2.1.12)
-- 先通过 CS.System.Collections.Generic.List(类名) 相当于C#得到 List<类名> 类
local List_String2 = CS.System.Collections.Generic.List(CS.System.String)
-- 再通过()实例化List对象
local myList2 = List_String2()
--其实也可以一步到位
myList2 = CS.System.Collections.Generic.List(CS.System.String)()
--添加List元素
myList2:Add("我是xLua新版本创建的List")
print(myList2[0])--我是xLua新版本创建的List
--List内存地址
print(myList2)--LUA: System.Collections.Generic.List`1[System.String]: -1649123328
Dictionary
添加 Dictionary 元素:调用 Dictionary 的成员方法 Add,注意成员方法要使用 : 调用
testDataCollectionsClass.dictionary:Add(1, "111")
testDataCollectionsClass.dictionary:Add(2, "222")
testDataCollectionsClass.dictionary:Add(6, "666")
得到 Dictionary 元素:Dictionary[键]
print(testDataCollectionsClass.dictionary[1]) -- 111
遍历 Dictionary:使用 pairs 遍历
for key, value in pairs(testDataCollectionsClass.dictionary) do
print(key, value)
-- LUA: 1 111
-- LUA: 2 222
-- LUA: 6 666
end
修改 Dictionary 元素:Dictionary[键] = 新值
testDataCollectionsClass.dictionary[1] = "111111"
print(testDataCollectionsClass.dictionary[1]) -- 111111
移除 Dictionary 元素:调用 Dictionary 的成员方法 Remove,注意成员方法要使用 : 调用
testDataCollectionsClass.dictionary:Remove(1)
for key,value in pairs(testDataCollectionsClass.dictionary) do
print(key,value)
-- LUA: 2 222
-- LUA: 6 666
end
-- print(testDataCollectionsClass.dictionary[1])--报错
创建Dictionary对象 xLua新版本(xLua版本>v2.1.12)
-- 先通过 CS.System.Collections.Generic.Dictionary(键类名,值类名) 相当于C#得到 Dictionary<键类名,值类名)> 类
local Dic_String_Vector3 = CS.System.Collections.Generic.Dictionary(CS.System.String, CS.UnityEngine.Vector3)
local Dic_Int_String = CS.System.Collections.Generic.Dictionary(CS.System.Int32, CS.System.String)
-- 再通过()实例化Dictionary对象
local myDictionary1 = Dic_String_Vector3()
local myDictionary2 = Dic_Int_String()
--添加一个右方向的Dictionary元素
myDictionary1:Add("right", CS.UnityEngine.Vector3.right)
myDictionary2:Add(666, "老铁666")
--遍历添加元素后的Dictionary对象 可以打印出元素键值
for i,v in pairs(myDictionary1) do
print(i,v)--LUA: right (1.0, 0.0, 0.0): 1065353216
end
for i,v in pairs(myDictionary2) do
print(i,v)--LUA: 666 老铁666
end
得到键为string类型的Dictionary元素
--中括号传入string键可能为nil
print(myDictionary1["right"])--nil 传入string键得不到
print(myDictionary2[666])--老铁666 传入int键可以得
--get_Item成员方法传入非string键可能会报错
print(myDictionary1:get_Item("right"))--LUA: (1.0, 0.0, 0.0): 1065353216
-- print(myDictionary2:get_Item(666))--报错
--set_Item成员方法 修改Dictionary键中的值
myDictionary1:set_Item("right", nil)
print(myDictionary1:get_Item("right"))--LUA: (0.0, 0.0, 0.0): 0 因为Vector3是结构体 所以会恢复默认值
-- myDictionary2:set_Item(666, "新值")--报错 对于键为Int类型的不支持
-- print(myDictionary2[666])
--TryGetValue成员方法 返回是否有该键 有的话返回该键的值
print(myDictionary1:TryGetValue("right"))--LUA: true (1.0, 0.0, 0.0): 1065353216
print(myDictionary2:TryGetValue(666))--LUA: true 老铁666
14.2 知识点代码
Lesson14_Lua调用CSharp_数据集合.lua
print('我是Lua脚本 Lesson14_Lua调用CSharp_数据集合')
print("**********知识点一 基本方法概述************")
--对于数据集合 在C#怎么使用 在Lua就使用C#对应的方法 而不遵循Lua的语法规则 除非Lua完全无法使用对应的C#方法
--实例化测试数据集合类
local testDataCollectionsClass = CS.Lesson14_TestDataCollectionsClass()
print("**********知识点二 数组************")
--数组长度 数组.Length 不能使用#去获取长度
print(testDataCollectionsClass.array.Length) --5
--访问元素 数组[索引]
print(testDataCollectionsClass.array[0]) --1
--修改元素 数组[索引] = 新值
testDataCollectionsClass.array[0] = 111
print(testDataCollectionsClass.array[0]) --111
--遍历数组 要遵循C#的规则 从0开始 到数组长度-1结束
-- 虽然lua中的索引从1开始 但是因为使用的是C#数组 不遵循Lua的语法规则
for i = 0, testDataCollectionsClass.array.Length - 1 do
print(testDataCollectionsClass.array[i])
end
--创建数组对象 使用系统的数组类的CreateInstance方法 传入元素类型和初始化长度
--数组的本质是系统定义好的类
local myArray = CS.System.Array.CreateInstance(typeof(CS.System.Int32), 10)
print(myArray.Length) --10
print(myArray[0]) --0
myArray[1] = 1
print(myArray[1]) --1
--数组内存地址 直接print(数组)
print(myArray) --LUA: System.Int32[]: 1396501760
print("**********知识点三 List***********")
--添加List元素 调用List的成员方法Add 注意成员方法要使用:调用
testDataCollectionsClass.list:Add(1)
testDataCollectionsClass.list:Add(2)
testDataCollectionsClass.list:Add(3)
--得到List元素 List[索引]
print(testDataCollectionsClass.list[0])
--List长度 List.Count
print(testDataCollectionsClass.list.Count) --3
--遍历List 要遵循C#的规则 从0开始 到数组长度-1结束
for i = 0, testDataCollectionsClass.list.Count - 1 do
print(testDataCollectionsClass.list[i])--1 2 3
end
--修改List元素 List[索引] = 新值
testDataCollectionsClass.list[0] = 111
print(testDataCollectionsClass.list[0])--111
--移除List元素 调用List的成员方法Remove 注意成员方法要使用:调用
testDataCollectionsClass.list:Remove(1)
for i = 0, testDataCollectionsClass.list.Count - 1 do
print(testDataCollectionsClass.list[i])--2 3
end
--List内存地址 直接print(List)
print(testDataCollectionsClass.list) --LUA: System.Collections.Generic.List`1[System.Int32]: 569280896
--创建List对象 xLua老版本(xLua版本<=v2.1.12)
-- 先通过 CS.System.Collections.Generic["List`1[类名]"] 相当于C#得到 List<类名> 类
local List_String1 = CS.System.Collections.Generic["List`1[System.String]"]
-- 再通过()实例化List对象
local myList1 = List_String1()
--其实也可以一步到位
myList1 = CS.System.Collections.Generic["List`1[System.String]"]()
--添加List元素
myList1:Add("我是xLua老版本创建的List")
print(myList1[0])--我是xLua老版本创建的List
--List内存地址
print(myList1)--LUA: System.Collections.Generic.List`1[System.String]: 1967029376
--创建Lis对象 xLua新版本(xLua版本>v2.1.12)
-- 先通过 CS.System.Collections.Generic.List(类名) 相当于C#得到 List<类名> 类
local List_String2 = CS.System.Collections.Generic.List(CS.System.String)
-- 再通过()实例化List对象
local myList2 = List_String2()
--其实也可以一步到位
myList2 = CS.System.Collections.Generic.List(CS.System.String)()
--添加List元素
myList2:Add("我是xLua新版本创建的List")
print(myList2[0])--我是xLua新版本创建的List
--List内存地址
print(myList2)--LUA: System.Collections.Generic.List`1[System.String]: -1649123328
print("*********知识点四 Dictionary***********")
--添加Dictionary元素 调用Dictionary的成员方法Add 注意成员方法要使用:调用
testDataCollectionsClass.dictionary:Add(1, "111")
testDataCollectionsClass.dictionary:Add(2, "222")
testDataCollectionsClass.dictionary:Add(6, "666")
--得到Dictionary元素 Dictionary[键]
print(testDataCollectionsClass.dictionary[1])--111
--遍历Dictionary 由于Lua没有foreach 使用pairs遍历
for key,value in pairs(testDataCollectionsClass.dictionary) do
print(key,value)
-- LUA: 1 111
-- LUA: 2 222
-- LUA: 6 666
end
--修改Dictionary元素 Dictionary[键] = 新值
testDataCollectionsClass.dictionary[1] = "111111"
print(testDataCollectionsClass.dictionary[1])--111111
--移除Dictionary元素 调用Dictionary的成员方法Remove 注意成员方法要使用:调用
testDataCollectionsClass.dictionary:Remove(1)
for key,value in pairs(testDataCollectionsClass.dictionary) do
print(key,value)
-- LUA: 2 222
-- LUA: 6 666
end
-- print(testDataCollectionsClass.dictionary[1])--报错
--创建Dictionary对象 xLua新版本(xLua版本>v2.1.12)
-- 先通过 CS.System.Collections.Generic.Dictionary(键类名,值类名) 相当于C#得到 Dictionary<键类名,值类名)> 类
local Dic_String_Vector3 = CS.System.Collections.Generic.Dictionary(CS.System.String, CS.UnityEngine.Vector3)
local Dic_Int_String = CS.System.Collections.Generic.Dictionary(CS.System.Int32, CS.System.String)
-- 再通过()实例化Dictionary对象
local myDictionary1 = Dic_String_Vector3()
local myDictionary2 = Dic_Int_String()
--添加一个右方向的Dictionary元素
myDictionary1:Add("right", CS.UnityEngine.Vector3.right)
myDictionary2:Add(666, "老铁666")
--遍历添加元素后的Dictionary对象 可以打印出元素键值
for i,v in pairs(myDictionary1) do
print(i,v)--LUA: right (1.0, 0.0, 0.0): 1065353216
end
for i,v in pairs(myDictionary2) do
print(i,v)--LUA: 666 老铁666
end
--获得Dictionary键中的值
--中括号传入string键可能为nil
print(myDictionary1["right"])--nil 传入string键得不到
print(myDictionary2[666])--老铁666 传入int键可以得
--get_Item成员方法传入非string键可能会报错
print(myDictionary1:get_Item("right"))--LUA: (1.0, 0.0, 0.0): 1065353216
-- print(myDictionary2:get_Item(666))--报错
--set_Item成员方法 修改Dictionary键中的值
myDictionary1:set_Item("right", nil)
print(myDictionary1:get_Item("right"))--LUA: (0.0, 0.0, 0.0): 0 因为Vector3是结构体 所以会恢复默认值
-- myDictionary2:set_Item(666, "新值")--报错 对于键为Int类型的不支持
-- print(myDictionary2[666])
--TryGetValue成员方法 返回是否有该键 有的话返回该键的值
print(myDictionary1:TryGetValue("right"))--LUA: true (1.0, 0.0, 0.0): 1065353216
print(myDictionary2:TryGetValue(666))--LUA: true 老铁666
Lesson14_Lua调用CSharp_数据集合
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson14_Lua调用CSharp_数据集合 : MonoBehaviour
{
void Start()
{
LuaManager.Instance.Init();
LuaManager.Instance.DoLuaFile("Lesson14_Lua调用CSharp_数据集合");
}
}
public class Lesson14_TestDataCollectionsClass
{
public int[] array = new int[5] { 1, 2, 3, 4, 5 };
public List<int> list = new List<int>();
public Dictionary<int, string> dictionary = new Dictionary<int, string>();
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com