14.Lua调用C#的数据集合

  1. 14.Lua调用CSharp-数据集合
    1. 14.1 知识点
      1. 准备工作
      2. 基本方法概述
        1. 对于数据集合的使用方法
        2. 准备用于测试的各种数据集合的类
        3. 实例化测试数据集合类
      3. 数组
        1. 数组长度:数组.Length 不能使用#去获取长度
        2. 访问元素:数组[索引]
        3. 修改元素:数组[索引] = 新值
        4. 遍历数组:从 0 开始到数组长度 - 1 结束,遵循 C# 规则
        5. 创建数组对象:使用系统的数组类的 CreateInstance 方法,传入元素类型和初始化长度
        6. 数组内存地址:直接 print(数组)
      4. List
        1. 添加 List 元素:调用 List 的成员方法 Add,注意成员方法要使用 : 调用
        2. 得到 List 元素:List[索引]
        3. List 长度:List.Count
        4. 遍历 List:从 0 开始到数组长度 - 1 结束,遵循 C# 规则
        5. 修改 List 元素:List[索引] = 新值
        6. 移除 List 元素:调用 List 的成员方法 Remove,注意成员方法要使用 : 调用
        7. List 内存地址:直接 print(List)
        8. 创建List对象 xLua老版本(xLua版本<=v2.1.12)
        9. 创建Lis对象 xLua新版本(xLua版本>v2.1.12)
      5. Dictionary
        1. 添加 Dictionary 元素:调用 Dictionary 的成员方法 Add,注意成员方法要使用 : 调用
        2. 得到 Dictionary 元素:Dictionary[键]
        3. 遍历 Dictionary:使用 pairs 遍历
        4. 修改 Dictionary 元素:Dictionary[键] = 新值
        5. 移除 Dictionary 元素:调用 Dictionary 的成员方法 Remove,注意成员方法要使用 : 调用
        6. 创建Dictionary对象 xLua新版本(xLua版本>v2.1.12)
        7. 得到键为string类型的Dictionary元素
    2. 14.2 知识点代码
      1. Lesson14_Lua调用CSharp_数据集合.lua
      2. Lesson14_Lua调用CSharp_数据集合

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

×

喜欢就点赞,疼爱就打赏