[5] 使用自定义lua解析管理器调用table

访问数组类型的table

CallLuaEntrance测试脚本中内容:

 //--------------------------------------访问table-----------------------------
//4.1 访问list/数组类型的table
//获取table
LuaTable luaTable = CallLuaManager.Instance().LuaState.GetTable("arrayTable");
//直接访问
Debug.Log("luaTable[1] " + luaTable[1]);
Debug.Log("luaTable[2] " + luaTable[2]);
Debug.Log("luaTable[3] " + luaTable[3]);
Debug.Log("luaTable[4] " + luaTable[4]);
Debug.Log("luaTable[5] " + luaTable[5]);
Debug.Log("luaTable[6] " + luaTable[6]);
Debug.Log("luaTable[7] " + luaTable[7]); //转成array存储访问
Object[] array = luaTable.ToArray();
for (int i = 0; i < array.Length; i++)
{
Debug.Log("listTable遍历访问 " + array[i]);
} //检测是否是深拷贝
//更改最后一个数值
luaTable[7] = 9999;
Debug.Log("-------------->luaTable[7] " + luaTable[7]);
//获取arrayTable2
luaTable = CallLuaManager.Instance().LuaState.GetTable("arrayTable2"); Object[] array2 = luaTable.ToArray();
for (int i = 0; i < array2.Length; i++)
{
Debug.Log("listTable遍历访问" + array2[i]);
}

对应的lua内容:

--list/数组类型的table
arrayTable = {2024,05,10,19,55,66,78} arrayTable2 = {"Hello","Lua",ture,123,88.88}

访问DIctionary类型的table

在C#脚本中使用LuaTable来接受获取到的Table,对于字典类型的Table调用LuaTable的ToDictTable方法转成对应类型的LuaDictTable

类型,获取字典的迭代器对字典进行迭代遍历。

CallLuaEntrance测试脚本中内容:

 //4.2 字典类型的table数值获取
luaTable = CallLuaManager.Instance().LuaState.GetTable("dicTable1");
Debug.Log("luaTable[\"date\"] " + luaTable["date"]);
Debug.Log("luaTable[\"name\"] " + luaTable["name"]);
Debug.Log("luaTable[\"blog\"] " + luaTable["blog"]);
Debug.Log("luaTable[\"WebBlog\"] " + luaTable["WebBlog"]); luaTable = CallLuaManager.Instance().LuaState.GetTable("dicTable2");
//转成LuaDictTable
// 因为键值对 各自的类型不统一 因此使用object
// 如果类型统一可以使用已知的
LuaDictTable<object, object> luaDictionary = luaTable.ToDictTable<Object, Object>();
Debug.Log("dictionary[true] = " + luaDictionary[true]); //通过迭代器遍历
IEnumerator<LuaDictEntry<object, object>> enumerable = luaDictionary.GetEnumerator(); while (enumerable.MoveNext())
{
Debug.Log(enumerable.Current.Key + " , " + enumerable.Current.Value);
}

访问的lua脚本中数据:

--Dictionary类型的table
dicTable1 = {
["date"] = "2024/05/10",
["name"] = "TonyChang",
["blog"] = "TonyCode",
["WebBlog"] = "cnblogs",
} dicTable2 = {
[12] = 666,
[true] = 1,
[20.01] = "Yes!",
["tony"] = "geeks",
}

最后总结一下:

在C#中调用lua中的Table和函数,就是先使用LuaState中方法获取到对应的函数或者table,之后根据获取的类型进行对应的解析访问。

一般我们调用一个具体的函数或者table时候,已经清楚其对应的类型,可以根据对应类型将table具体转换,之后访问使用。

此外发现,luaTable中的是浅拷贝(索引指向同一个数值),即在获取到的luaTable中更改数值其原数值也会改变。

使用自定义lua解析管理器调用lua脚本中的table的更多相关文章

  1. UI 自定义视图 ,视图管理器

    一>自定义label - textField 视图 自定义视图:系统标准UI之外,自己组合而出的新的视图 iOS 提供了很多UI组件 ,借助它们,我们可以做各种程序 尽管如此,实际开发中,我们还 ...

  2. 使用 NuGet 包管理器在 Visual Studio 中安装和管理包

    https://docs.microsoft.com/zh-cn/nuget/consume-packages/install-use-packages-visual-studio 通过 Window ...

  3. .net 调用 Python脚本中的代码

    使用工具:IronPython 工具介绍:是一种在 .NET 及 Mono上的 Python 实现,是一个开源的项目,基于微软的 DLR 引擎.(个人理解就是在 .net上面运行Python代码) 使 ...

  4. C++调用Python脚本中的函数

    1.环境配置 安装完python后,把python的include和lib拷贝到自己的工程目录下 然后在工程中包括进去 2.例子 先写一个python的测试脚本,如下 这个脚本里面定义了两个函数Hel ...

  5. lua内存管理

    本文内容基于版本:Lua 5.3.0 Lua内存管理器规则 Lua允许用户自定义内存管理器,并在创建Lua虚拟机(lua_State实例)时传入.当然自定义内存管理器必须遵循Lua已定义的一些行为规则 ...

  6. 【Android 应用开发】AndroidUI设计之 布局管理器 - 详细解析布局实现

    写完博客的总结 : 以前没有弄清楚的概念清晰化 父容器与本容器属性 : android_layout...属性是本容器的属性, 定义在这个布局管理器的LayoutParams内部类中, 每个布局管理器 ...

  7. AndroidUI设计之 布局管理器 - 详细解析布局实现

    写完博客的总结 : 以前没有弄清楚的概念清晰化 父容器与本容器属性 : android_layout...属性是本容器的属性, 定义在这个布局管理器的LayoutParams内部类中, 每个布局管理器 ...

  8. 自定义缓存管理器 或者 Spring -- cache

    Spring Cache 缓存是实际工作中非常常用的一种提高性能的方法, 我们会在许多场景下来使用缓存. 本文通过一个简单的例子进行展开,通过对比我们原来的自定义缓存和 spring 的基于注释的 c ...

  9. Django Managers管理器

    Managers class Manager 管理器是向Django模型提供数据库查询操作的接口.Django应用程序中每个模型至少有一个管理器. Manager names 默认情况下管理器的名字为 ...

  10. 『动善时』JMeter基础 — 20、JMeter配置元件【HTTP Cookie管理器】详细介绍

    目录 1.HTTP Cookie管理器介绍 2.HTTP Cookie管理器界面详解 3.JMeter中对Cookie的管理 (1)Cookie的存储 (2)Cookie的管理策略 4.补充:Cook ...

随机推荐

  1. 深入理解 C++ 语法:从基础知识到高级应用

    C++ 语法 让我们将以下代码分解以更好地理解它: 示例 #include <iostream> using namespace std; int main() { cout <&l ...

  2. 灵活配置 Spring 集合:List、Set、Map、Properties 详解

    使用<property>标签的value属性配置原始数据类型和ref属性配置对象引用的方式来定义Bean配置文件.这两种情况都涉及将单一值传递给Bean 那么如果您想传递多个值,例如Jav ...

  3. Seaborn分布数据可视化---统计分布图

    统计分布图 barplot() sns.barplot( x=None, y=None, hue=None, data=None, order=None, hue_order=None, estima ...

  4. 第一篇:Python入门基础

    主要内容 1.Python简介 2.变量 3.字符编码 4.用户交互 5.if 流程判断 6.while循环 7.for循环 一.Python简介 1.python的创始人为吉多·范罗苏姆(Guido ...

  5. 演示webuploader和cropperjs图片裁剪上传

    最近有个项目要在浏览器端裁剪并上传图片.由于缺乏人力,只能我上阵杀敌.通过参考各种文章,最后决定用cropperjs进行图片裁剪,用webuploader上传文件.本文涉及到的知识至少有Java基础. ...

  6. 五款最优秀的java微服务框架

    微服务被广泛用于创建多功能的应用程序,通过组合每个功能部分并将它们逐层放在一个单元中.许多人可能没有意识到微服务是一组小型服务中制作单个应用程序的方法,每个服务都独立运行(进程). java微服务框架 ...

  7. Lattice高速下载器HW-USBN-2B 如何申请 license

    如果用的芯片不是停产老旧芯片,Diamond programmer 是不需要 license 绑定支持的. 但是有些需要编程老旧的芯片.需要安装 Diamond programmer stand-al ...

  8. 架构设计|基于 raft-listener 实现实时同步的主备集群

    背景以及需求 线上业务对数据库可用性可靠性要求较高,要求需要有双 AZ 的主备容灾机制. 主备集群要求数据和 schema 信息实时同步,数据同步平均时延要求在 1s 之内,p99 要求在 2s 之内 ...

  9. Flutter笔记-基础组件

    图片和Icon 加载网络图片以及本地图片 Image( image: NetworkImage( "https://img-s-msn-com.akamaized.net/tenant/am ...

  10. python 多进程jieba分词,高效分词,multiprocessing

    自然语言任务经常使用jieba分词,数据量大时怎么加速,jieba分词不支持使用asyncio异步加速,使用multiprocessing还是可以的 import jieba import jieba ...