今天说一下读取Json文件,生成菜单树。
菜单树可以直接去Asset Store搜索TreeView,下载免费的那个

那么拿到菜单树之后,怎么将Json数据植入到我菜单树里面呢?
这就需要我们对Json文件做一些处理了。
既然称之为树,那么深度肯定是必不可少的东西,以根节点深度0为基准,子节点深度为1,孙节点深度为2等。知道了每个节点的深度,还得知道父节点是谁,否则就是某个孙子知道自己有爷爷,但是不知道自己爷爷是谁了。
有了父子关系和深度,那么就好办了
首先根据Json数据计算出最大深度,这决定了我们要创建多少级菜单。
直接上代码:

 public struct MenuTree{public string name;public string type;public float id;public float depth;public float parentId;public Color color;public string info;public string state;public string equipment;public string component;public FaultItem[] faultItem;}public static MenuTree[] LoadMenuTreeData(JsonData jd){menuTreeDatas = new MenuTree[jd.Count];for (int i = 0; i < jd.Count; i++){faultItems = new FaultItem[jd[i]["faultItem"].Count];for (int j = 0; j < jd[i]["faultItem"].Count; j++){faultItems[j].faultName = jd[i]["faultItem"][j]["faultName"].ToString();faultItems[j].faultId =int.Parse(jd[i]["faultItem"][j]["faultId"].ToString());}menuTreeDatas[i].name = jd[i]["name"].ToString().TrimEnd();menuTreeDatas[i].type = jd[i]["type"].ToString().TrimEnd();menuTreeDatas[i].id = float.Parse(jd[i]["id"].ToString());menuTreeDatas[i].depth = float.Parse(jd[i]["depth"].ToString());menuTreeDatas[i].parentId = float.Parse(jd[i]["parentId"].ToString());menuTreeDatas[i].info = jd[i]["info"].ToString();menuTreeDatas[i].state = jd[i]["state"].ToString();menuTreeDatas[i].equipment = jd[i]["equipment"].ToString();menuTreeDatas[i].faultItem = faultItems;}return menuTreeDatas;}public static MenuTree[] LoadLocalMenuTree(){string ta = File.ReadAllText(Application.streamingAssetsPath + "/MenuTree.json");JsonData jd = JsonMapper.ToObject(ta.ToString());menuTreeDatas = LoadMenuTreeData(jd);return menuTreeDatas;}public static float GetMaxDepth(){MenuTree[] tmp = DataHandler.LoadLocalMenuTree();float maxDepth = tmp[0].depth;for (int i = 1; i < CV_DataHandler.LoadLocalMenuTree().Length; i++){if (maxDepth < tmp[i].depth)maxDepth = tmp[i].depth;}return maxDepth;}

好的,获取到了最大深度,那么我们就可以大刀阔斧地干了,直接找到导入的Example脚本,挂载在空物体上,然后再添加TreeViewControl脚本,把所有你能看到的ParentControl变量都拖上去,然后修改Example脚本的PopulateExampleData方法:

 public static void PopulateExampleData(TreeViewControl item){MenuTree[] tmp = DataHandler.LoadLocalMenuTree();item.Width = 260;item.Height = 1000;item.Header = "-1节点";//根节点的父节点,也可以直接作为根节点List<MenuTree> menuTree = tmp.ToList();float dep = DataHandler.GetMaxDepth();for (int i = 0; i <= dep; i++){foreach (var it in menuTree){if (it.depth.Equals(i)){TreeViewItem tvitem = new TreeViewItem(null, null);//生成新的菜单项float pd = it.parentId;//父物体IDstring _name = it.name;if (pd < 0)//根节点没有父物体,父物体ID小于0就行tvitem = item.RootItem.AddItem(_name);elsetvitem = treeViewItemList.Find(x => x.ID.Equals(pd)).AddItem(_name);tvitem.ID = it.id;tvitem.equipmentName = it.equipment;tvitem.myName = it.name;AddEvents(tvitem);treeViewItemList.Add(tvitem);addName.Add(_name);}}}}

于是我们就能得到我们想要的效果了,其中TreeViewItem可以添加自己想要存储的变量,点击的时候可以获取这些变量。
当我们敲代码的时候遇到某些逻辑问题难以捋清的时候,不妨试一试通过伪代码,或者直接一行一行先用文字述清每一步的逻辑,再回过头来,事情也许就能变的简单很多。
周更,迟交一天,罪过

Unity菜单树 TreeView相关推荐

  1. Unity菜单树模糊查询

    接上周菜单树,链接: 菜单树生成. 菜单树的优势体现在便于上下级转换,但是当树的节点较多,深度较大的时候,想要找到某个节点,光靠一级一级展开也是麻烦 于是查询功能也就很有必要了. 首先创建一个Inpu ...

  2. Bootstrap系列之treeview实现菜单树

    本博客,介绍通过Bootstrap的treeview插件实现菜单树的功能. treeview链接:http://www.htmleaf.com/Demo/201502141380.html ORM框架 ...

  3. 仿WINDWS无限级Ajax菜单树升级1.2版(菜单名支持非法字符)

    仿WINDWS无限级Ajax菜单树升级1.2版(菜单名支持非法字符)          1.1版出现了输入非法字符与空格后导致程序出错的BUG,我对程序再次升级为1.2版,这次将支持非法字符式的菜单名 ...

  4. Mybatis通过colliection属性递归获取菜单树

    1.现有商品分类数据表category结构如下,三个字段都为varchar类型 2.创建商品分类对应的数据Bean /*** */ package com.xdw.dao;import java.ut ...

  5. 仿WINDWS无限级Ajax菜单树升级1.3版(修补了严重BUG)

    仿WINDWS无限级Ajax菜单树升级1.3版(修补了严重BUG) WINDWS无限级Ajax菜单树又升级了(1.3版)              对以下BUG进行了修复       1.只能在文字上 ...

  6. php 显示下拉菜单,PHP在下拉列表中显示菜单树

    菜单树的功能: function category_tree($parent_id) { $sql = "SELECT * FROM menu WHERE parent_id ='" ...

  7. 菜单转换Java_java递归菜单树转换成pojo对象

    package com.cjonline.foundation.authority.pojo; import java.util.ArrayList; import java.util.Collect ...

  8. java递归把list菜单列表转为菜单树

    java递归把列表转为菜单树 菜单实体类 package com.utils.menu;import java.util.List;public class Menu {private String ...

  9. 使用jquery的accordion实现手风琴效果菜单树

    jquery的accordion的使用非常简单,只需要给它一个固定格式的ul即可...好像是句废话... 那么如何实现呢?请看下面(小明同学别低头...) jquery-2.1.0.min.js sc ...

最新文章

  1. LINUX 查找tomcat日志关键词
  2. 当程序员的一个人无聊时,甚至用Python开发出机器人看他们聊天
  3. 在YII2框架中使用UEditor编辑器发布文章
  4. Spark SQL 源代码分析系列
  5. Google protobuf使用技巧和经验
  6. 《深度探索C++对象模型》--4 Function语意学
  7. B. 熟练剖分(tree) (概率DP)
  8. Vue源码解析之数组变异
  9. Python压缩解压–zipfile
  10. linux 固态硬盘 分区工具,固态硬盘怎么分区?使用免费分区助手轻松搞定!
  11. CodeSmith简单示例
  12. chrome无法打开应用商店添加扩展程序的解决方案
  13. WPS表格简单入门_我的笔记_一些常用操作
  14. 路由器注册灯闪烁没网络
  15. kylin2.1.0 + CHD5.7环境搭建
  16. 通过 scrapy 爬取豆果美食热门数据, 使用 flask 搭建后端, 最后搭建一个简单的小程序
  17. intel无线网络管理服务器,配置Intel无线网卡连接到管理帧保护(MFP) -启用网络
  18. 透彻理解神经网络剪枝算法
  19. 关于极光APP推送JPUSH的服务器端使用
  20. 最新Win10离线安装.NET Framework 3.5的方法(不需要离线包,只需原版系统安装包,亲测完美快捷有效)

热门文章

  1. 南京大学计算机 吴迪,吴迪 教授
  2. 五险一金”的陷阱和奥秘?!
  3. 《缠中说禅108课》102:再说走势必完美
  4. 计算机辅助设计技术基础教程,AutoCAD基础教程(计算机辅助设计系列教材)
  5. CMU-15445 课程和实验介绍
  6. 全球行动如何在电脑上玩 全球行动模拟器玩法教程
  7. Android记录4--自定义ToggleButton+用SharedPreferences保存用户配置
  8. git remote add origin错误
  9. android多媒体文件扫描
  10. Renode应用:在RISC-V核上运行FreeRTOS