在u3d5.x中,使用ugui作为默认的界面系统,但控件实在太少,很多需求都不能满足,比如弹出菜单(PopupMenu)

我也懒得去网上找现成的实现,再加上现有代码已经有很多有关列表控件的功能,不想再重新动这些代码。

所以自己实现一个,目前先只实现核心、搭建控件相关类的骨干,后期再慢慢丰富和做的更花哨。

开篇之前声明,我的u3d理解非常有限,有很多也许本身自带的功能或有现成库功能我不知道,所以选择了自己探索或实现,

感觉太low欢迎给出好的意见。

定义和代码结构

PopupMenu是点击鼠标或按钮后,在相应位置弹出的一个列表控件。

这个列表拥有子列表,点击或鼠标进入某个列表项后,将弹出子列表。

子列表本身也是一个PopupMenu,也可以有拥有子列表。

由这个定义可以看出:

1、PopupMenu首先需要列表控件的支持,但ugui的ScrollView支持不够,所以需要动态列表的支持。

2、其次列表项需要支持点击或进入事件,点击Click事件,ugui的button是支持的;鼠标进入PointEnter事件,不支持。所有需要一个扩展按钮实现进入事件的响应,这是可选项。

3、每个列表项需要有特殊标识,或者要装载一份部分数据,至少有不同的点击或进入响应函数,这需要需要一类去实现,即列表项。

4、需要一个类实现弹出、隐藏、创建列表、调整位置等弹出菜单的功能,这个类就是弹出菜单的组件。

 

动态列表

动态列表是让ugui的ScrollView支持动态添加、删除列表项的类。我的代码命名为ViewList,关键需要实现动态创建列表项和调整ContentSize的功能。

这里创建一个自有文本信息的列表项:

   public ListViewItem CreateTextButton(string itemName ){GameObject prototype = Resources.Load<GameObject>("GUI/Control/ItemTextButton");GameObject button = GameObject.Instantiate(prototype);button.transform.SetParent(viewContent.transform);button.transform.localScale = new Vector3(1.0f, 1.0f, 1.0f);button.name = prototype.name + "_" + itemName;Text text = button.transform.Find("Text").GetComponent<Text>();text.color = new Color(0xa9 / 255f, 0xdd / 255f, 0xfd / 255f);text.text = itemName;ListViewItem i = button.GetComponent<ListViewItem>();if (i == null)i = button.AddComponent<ListViewItem>();i.listView = this;m_Items.Add(i);_ResizeVerticalContent(button);return i;}

其中ListViewItem是列表项,将所有item记录到m_Items,便于PopupMenu里操作。

viewContent是列表项的父节点,支持ScrollRect也支持不使用ScrollRect:

  if (GetComponent<ScrollRect>())viewContent = GetComponent<ScrollRect>().content.gameObject;elseviewContent = gameObject;

下面代码实现对垂直布局的content的大小控制。

    void _ResizeVerticalContent( GameObject button){float height = button.GetComponent<LayoutElement>().minHeight;float spacing = viewContent.GetComponent<VerticalLayoutGroup>().spacing;float tb = viewContent.GetComponent<VerticalLayoutGroup>().padding.top;viewContent.GetComponent<RectTransform>().sizeDelta = new Vector2(viewContent.GetComponent<RectTransform>().sizeDelta.x,m_Items.Count * (spacing + height) - spacing + tb);}

控制content的大小很重要,对于ScrollView来说,content放下所有列表项,对Viewport设置mask,content的长度(就垂直滚动而言)远远大于Viewport,只显示viewport大小范围内的

content,从而实现滚动效果。对于非ScrollView,即将自身但做列表项的容器,不存在滚动效果,自身的大小需要和列表项的个数相契合。

如果是Grid布局的,可以参考下面的代码:

        float height = button.GetComponent<LayoutElement> ().minHeight;float spacing = viewContent.GetComponent<GridLayoutGroup> ().spacing.y;int NC = (int)(viewContent.GetComponent<RectTransform> ().sizeDelta.x /button.GetComponent<LayoutElement> ().minWidth);viewContent.GetComponent<RectTransform> ().sizeDelta = new Vector2 (viewContent.GetComponent<RectTransform> ().sizeDelta.x,(viewContent.transform.childCount % NC == 0 ?viewContent.transform.childCount / NC :viewContent.transform.childCount / NC + 1) * (float)(spacing + height));

下篇将介绍扩展按钮、ViewListItem等

转载于:https://www.cnblogs.com/uncleciba/p/5730731.html

糍粑大叔的独游之旅-u3d实现弹出菜单(上)-动态列表相关推荐

  1. 糍粑大叔的独游之旅-开篇语

    开篇语 从事IT行业近8年了,虽然有编写文档的习惯,但从来没有写博客的习惯. 现在的工作开始慢慢偏向IT相关的管理工作,从事具体技术工作的时间越来越少, 但我始终保持着对技术的热爱. 特别是游戏编程. ...

  2. 糍粑大叔的独游之旅-战斗!之弹道实现(上)

    本来应该接着将PopupMenu,但具体开发的笔记本不在身边,手头的电脑上没有最新的代码, 所以只能暂时停下那个内容,先谈谈另外一个有趣的内容--u3d实现子弹弹道. 当然这个完整的说,也非常复杂,还 ...

  3. 零经验小白的独游历程——如何解决独立游戏的素材问题

    前言 曾经看过很多可以一个人搞定美术.编程.策划的独游大佬,心里虽然很佩服,但是就我个人的观点是--现代社会的大部分工作都是需要分工合作才能完成的.尤其是游戏这种专业性很强的产品,更需要每个人各司其职 ...

  4. 名帖230 张雨 行书《独游龙井方圆庵卷》

    <中国书法名帖目录> 张雨<独游龙井方圆庵行书诗卷>行书,至正二年(1342年),香港中文大学文物馆藏. [释文]独游龙井方圆庵僧照请阅宋五贤二开士象 独寻招提游,果得世外欢. ...

  5. [转载]九寨沟自游青年旅舍为您献上九寨沟二次进沟独门攻略!

    玩九寨沟一天的时间是绝对不够的!要想好好把九寨沟看个遍最佳的游览时间应该是一天半到两天.要想玩这么长的时间就只能二次进沟了,九寨沟二次进沟怎么玩?别着急!九寨沟自游青年旅舍为您献上九寨沟二次进沟独门攻 ...

  6. docker omv 防火墙_我的软路由折腾之旅 篇三:在openmediavault上通过Docker实现OPENWRT旁路由功能...

    我的软路由折腾之旅 篇三:在openmediavault上通过Docker实现OPENWRT旁路由功能 2020-06-20 11:28:38 57点赞 415收藏 74评论 你是AMD Yes党?还 ...

  7. 机器人专用符文_英雄联盟【LOL】手游部分英雄天赋符文和出装推荐

    机器人天赋符文和出装推荐 目前,LOL手游机器人主流天赋点法是主坚决系,副系天赋使用启迪.玩家一定要记得点上余震天赋,这样机器人输出的伤害会更高,而且在拆除塔时也会对塔造成额外的伤害.此外,坚决系的特 ...

  8. 手游频繁崩溃”闪退”? 从程序上找原因

    手游频繁崩溃"闪退"? 从程序上找原因 作为玩家,当游戏crash的时候是什么心情,如果这个游戏玩起来还不错的话,那我可能还会打开第二次,如果这个游戏一般的话我可能直接怒删了.当多 ...

  9. div alert html,基于jQuery的弹出消息插件 DivAlert之旅(一)

    想着自己学习Javascript,以及Ajax.jQuery等已经有一段时间了,不过貌似还没有写过一个插件,看到jQuery官网上那么多令人眼前一亮的插件,自己今天也动心说是不是能够写一个类似的插件来 ...

最新文章

  1. java 数据库 流式查询_关于mybatis:强大MyBatis-三种流式查询方法
  2. 转:设置session过期时间
  3. oracle中查看pga大小,oracle调整sga、pga大小
  4. struct 与 class区别
  5. 【数学和算法】协方差矩阵、方差
  6. CF388C-Fox and Card Game【博弈论,结论】
  7. Xenix — 微软与UNIX的短暂爱恋
  8. Python中的关键字和内置函数
  9. 基于uFUN开发板的RGB调色板
  10. cocos2d笔记 (4)cocos2d里的各种动作
  11. mysql 中 where条件的OR 和 and 加括号的说法
  12. Android之ContentProvider总结
  13. 如何快乐地检测SQL注入
  14. linux基础(十四)定时任务和管理系统的临时文件
  15. 『伪原创工具 』英文在线伪原创工具
  16. mysql无法加载主类_错误: 找不到或无法加载主类 JDBC
  17. 服务器磁盘阵列数据恢复方法和数据恢复过程详解
  18. java更改图片小于32kb_echarts上传图表图片到Java 后台保存出来是空白图片?
  19. ubuntu下配置虚拟内存
  20. 利用URLOS搭建自己的CDN网站加速节点真是其乐无穷

热门文章

  1. 以太坊ETH不能转账,状态一直是pending状态原因和解决方法
  2. LeetCode算法题-Design LinkedList(Java实现)
  3. 通过 MySQL 二进制日志恢复删除的记录
  4. RTP/RTCP协议与RTSP协议
  5. 邪恶改装:TPYBoard制作廉价WIFI干扰器
  6. MySQL Create Table创建表
  7. 用printf做彩色日志记录
  8. Bootstrap-学习系列
  9. tomcat 设置xms xmx,采用startup.bat启动和采用操作系统服务启动区别
  10. phpeclipse+xdebug配置