前言

最近使用ToLua框架使用Unity中的Dropdown组件,其他属性都还好和在C#中使用的形式差不多,只是修改成了Lua的语法习惯就可以了,但是我有个需求,是要需要实现动态添加Dropdown中的Options,这个就很做起来废了半天劲,后来发现是被坑了,本文就说说在ToLua框架中使用Dropdown动态添加Options。

Unity 之 ToLua框架中使用Dropdown

  • 前言
  • 一,在C#中动态添加Options
  • 二,在Lua中动态添加Options
  • 三,在Lua中使用需要注意的==点==

一,在C#中动态添加Options

1.获取Dropdown组件,然后动态添加options:

  //创建Dropdown自定义预制体,并获取其组件Dropdown dropDown= GetPoolItem(rowRoot, "CreateRoom_Dropdown").GetComponent<Dropdown>();Dropdown.OptionData data = new Dropdown.OptionData();data.text = "下拉选项1";dropDown.options.Add(data);

或者你也可以这么写:

 List<Dropdown.OptionData> listOptions = new List<Dropdown.OptionData>();       listOptions.Add(new Dropdown.OptionData("下拉选项2"));listOptions.Add(new Dropdown.OptionData("下拉选项3"));dropDown.AddOptions(listOptions);

2.其他属性获取简介推荐查看:
Unity 之 UGUI Dropdown组件使用简析


二,在Lua中动态添加Options

1.首先要在CustomSettings中添加_GT(typeof(Dropdown.OptionData))

2.在工程中点击Lua --> Generate All 重新打出Warp包

3.然后你在工程LuaFramework --> Source --> Generate 目录下可以找到名字为UnityEngine_UI_Dropdown_OptionDataWrap的C#文件,然后看下Register方法,开始使用:

 public static void Register(LuaState L){L.BeginClass(typeof(UnityEngine.UI.Dropdown.OptionData), typeof(System.Object));L.RegFunction("New", _CreateUnityEngine_UI_Dropdown_OptionData);L.RegFunction("__tostring", ToLua.op_ToString);L.RegVar("text", get_text, set_text);L.RegVar("image", get_image, set_image);L.EndClass();}

4.使用Lua动态添加添加Options

在文件头做个引用

local OptionData = UnityEngine.UI.Dropdown.OptionData

按照C#中写的步骤使用Lua的形势写:

function CreateDropdown(ctrlNodel,rowParent)-- 这里改成你自己的获取组件的方式local newDorpDown = resMgr:LoadPrefab(PrefabsPath.."CreateRoom_Dropdown",rowParent):GetComponent("Dropdown");-- 这是一个错误写法 正确需要用.调用local data = OptionData:New();data.text = "下拉选项1";newDorpDown.options:Add(data);
end

按照这个流程写是没有问题的,如果你这时候运行后成功设置了options属性了,那么你就不用往下看了;如果你没有运行成功,请你断点调试或者在代码中间打几个日志。经查:我发现代码是在local data = OptionData:New();这行就执行出了问题,就没有向下执行了。


三,在Lua中使用需要注意的点

不知道为什么在New的时候执行逻辑会有问题,上面介绍过了,在UnityEngine_UI_Dropdown_OptionDataWrap
这个类里面,Lua中调用的New方法实际上走的是C#中的_CreateUnityEngine_UI_Dropdown_OptionData这个方法,看上面Register这个方法这样写的:

L.RegFunction("New", _CreateUnityEngine_UI_Dropdown_OptionData);

所以我去查看这个方法:

[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]static int _CreateUnityEngine_UI_Dropdown_OptionData(IntPtr L){try{int count = LuaDLL.lua_gettop(L);if (count == 0){UnityEngine.UI.Dropdown.OptionData obj = new UnityEngine.UI.Dropdown.OptionData();ToLua.PushObject(L, obj);return 1;}else if (count == 1 && TypeChecker.CheckTypes<UnityEngine.Sprite>(L, 1)){UnityEngine.Sprite arg0 = (UnityEngine.Sprite)ToLua.ToObject(L, 1);UnityEngine.UI.Dropdown.OptionData obj = new UnityEngine.UI.Dropdown.OptionData(arg0);ToLua.PushObject(L, obj);return 1;}else if (count == 1 && TypeChecker.CheckTypes<string>(L, 1)){string arg0 = ToLua.ToString(L, 1);UnityEngine.UI.Dropdown.OptionData obj = new UnityEngine.UI.Dropdown.OptionData(arg0);ToLua.PushObject(L, obj);return 1;}else if (count == 2){string arg0 = ToLua.CheckString(L, 1);UnityEngine.Sprite arg1 = (UnityEngine.Sprite)ToLua.CheckObject(L, 2, typeof(UnityEngine.Sprite));UnityEngine.UI.Dropdown.OptionData obj = new UnityEngine.UI.Dropdown.OptionData(arg0, arg1);ToLua.PushObject(L, obj);return 1;}else{return LuaDLL.luaL_throw(L, "invalid arguments to ctor method: UnityEngine.UI.Dropdown.OptionData.New");}}catch (Exception e){return LuaDLL.toluaL_exception(L, e);}}

这是框架个自动生成的方法啊,看起来没问啊,,,有不带参数的,一个参数的,两个参数的校验,并且有异常校验,简直是完美啊。然而为什么我上面的调用不好用呢,有些想不明白。

我尝试使用一个参数的形式调用:

function CreateDropdown(ctrlNodel,rowParent)-- 这里改成你自己的获取组件的方式local newDorpDown = resMgr:LoadPrefab(PrefabsPath.."CreateRoom_Dropdown",rowParent):GetComponent("Dropdown");local data = OptionData:New("下拉选项1");newDorpDown.options:Add(data);
end

结果运行起来还是不好使,两个参数的我也尝试了,结果当然还是不行。
我开始怀疑这个自动生成的这Warp文件执行的有问题啊,我在下图位置加了个日志:

运行起来果然有问题,我写的调用的无参数的然而输出的参数个数却是1个:

local data = OptionData:New();


同理我尝试了传一个参数调用,输出的参数个数是2个,事实证明当我使用OptionData:New();这种形式调用的时候,会默认传递一个参数,,,

默认参数,,,嗯,,,思考了下,学习Lua的时候使用冒号(:)调用的时候就会传递一个self啊,,,然后我尝试使用(.)来调用,,,结果就真的没问题了,真是坑啊,,,还是自己没有使用明白啊,,,以此来博文,来加深下印象,希望可以帮到遇到相关问题的你。


修改后调用代码如下:

function CreateDropdown(ctrlNodel,rowParent)-- 这里改成你自己的获取组件的方式local newDorpDown = resMgr:LoadPrefab(PrefabsPath.."CreateRoom_Dropdown",rowParent):GetComponent("Dropdown");local data = OptionData.New("下拉选项1");newDorpDown.options:Add(data);
end

Unity 之 ToLua框架中UI.Dropdown组件动态添加Options相关推荐

  1. mysql 中的neq_mysql中neq使用Python的Django框架中的压缩组件Django Compressor_MySQL

    为了加快网站的加载速度,我们通常要多js和css进行压缩处理.这些js和css的压缩工作如果都手动处理,费时费力. <mysql中neq使用Python的Django框架中的压缩组件Django ...

  2. 能在任意一种框架中复用的组件,太牛了!

    Web Component 是一种 W3C标准支持的组件化方案,通过它可以编写可复用的组件,同时也可以对自己的组件做更精细化的控制.更牛的是,Web Component 可以在任何一种框架中使用,不用 ...

  3. [Unity][FlowCanvas] 预制体中新建的组件无法拖入 GameObject 类型的黑板的解决办法:关闭预制体之后再打开

  4. spring框架中JDK和CGLIB动态代理区别

    转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言 JDK动态代理实现原理(jdk8):https://blog.csdn.net ...

  5. Java实战应用50篇(二)-SSM框架中的设计模式:动态代理

    前言 动态代理和责任链无论在Spring还是MyBatis中都有重要的应用,代理模式的意义在于生成一个占位(又称代理对象),来代理真实对象(又称目标对象),从而控制真实对象的访问. 先来谈谈什么是代理 ...

  6. Qt工作笔记-图形视图框架中的分组,以及添加平行拖动图元

    啥意思,感觉本人语文学得菜,不好描述. 直接看程序运行截图: 1.隐藏鼠标: 2.图元分组: 3.视图与场景坐标转换 程序源码如下: mygraphicsitem.h #ifndef MYGRAPHI ...

  7. ng-zorro中表格树的动态添加、修改、删除节点操作

    在开发中,有时需要以表格树的形式加载数据,但是数据量特别大时,可能只是先加载一层,如果有子节点就在名称前显示一个"+"号或其它图标,然后点击"+"再展示子节点. ...

  8. [Unity] 战斗系统学习 8:构建 TPS 框架 3:mono 组件

    1. 框架组件 1.1 FrameworkComponent v1 一开始我想的是这样做框架组件嘛,跟 GF 学的 但是后来我才知道 static 变量是默认在监视器上不显示的,怪不得 GF 不在 A ...

  9. Vue移动端框架Mint UI接口跨域问题

    自己写了一个json数据,放在服务器上,现在要通过vue项目调用数据 http://www.intmote.com/test.json 我现在要调用 在调用接口数据的时候的时候 会出现这样的报错 Ac ...

最新文章

  1. XNA之RPG游戏开发教程之三
  2. php imagevue,Imagevue 2.1.4 正式注册版(PHP Flash相册源代码下载)
  3. Java中的锁的概念大汇总
  4. BZOJ 3514 Codechef MARCH14 GERALD07加强版
  5. Oracle的闪回特性之恢复truncate删除表的数据
  6. 优先级反转实验,使用信号量实现【RT-Thread学习笔记 5】
  7. JAVA设计模式之抽象工厂模式
  8. [20170612]FOR ALL COLUMNS SIZE repeat(11g).txt
  9. Kubernetes Pod
  10. 微信公众号H5游戏平台完整源码放送给大家
  11. CSS网页切图实例教程上
  12. 【245】◀▶IEW-Unit10
  13. 嵌入式微处理器的体系结构
  14. excel导出java不完整_有关Java POI导出excel表格中,单元格合并之后显示不全的解决方法。...
  15. uniapp H5接入使用环信聊天
  16. 林奕含《房思琪的初恋乐园》全文/原文
  17. TimeStamp日期类型转化成json
  18. (二)如何识别骗子(酒托、咖啡托、各种托)
  19. Solr in Action 第一章翻译(待整理)
  20. Android Verified Boot dm-verity 优化和实战

热门文章

  1. vue3中tree shaking特性
  2. JAVA中的装箱与拆箱
  3. iSCSI存储系统基础知识(一)
  4. 【直播数据分析】2022年 9月 最新抖音wss 分析
  5. 在线 阿里矢量 失效 配置后仍不发显示 icon
  6. Python写入、读取json文件
  7. Delphi优秀免费资源
  8. 作用力与反作用力摘要(补课= =)
  9. pip、pip2以及pip3的区别以及使用方法
  10. Linux外网远程登录访问内网主机