unity editor 折叠树
https://blog.csdn.net/e295166319/article/details/52370575
需要两个类:树节点类和界面实现类
1:树节点类(TreeNode)
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- public class TreeNode {
- public enum TreeNodeType
- {
- Item,
- Switch
- }
- public string name;
- public TreeNodeType nodeType = TreeNodeType.Item;
- public TreeNode parent;
- public List<TreeNode> children = null;
- public bool isOpen = false;
- public static TreeNode _instance = null;
- public static TreeNode Get()
- {
- if (_instance == null)
- {
- _instance = new TreeNode ();
- }
- return _instance;
- }
- public void InsertNode(TreeNode node)
- {
- if (this.children == null)
- {
- this.children = new List<TreeNode> ();
- }
- children.Add (node);
- node.parent = this;
- }
- public void OpenAllNode(TreeNode node)
- {
- node.isOpen = true;
- if (node.children != null && node.children.Count > )
- {
- for (int i = ; i < node.children.Count; i++)
- {
- OpenAllNode (node.children[i]);
- }
- }
- }
- public TreeNode GenerateFileTree(List<string> list)
- {
- TreeNode root = new TreeNode ();
- root = GenerateFileNode ("", "生物/", list);
- OpenAllNode (root);
- return root;
- }
- public TreeNode GenerateFileNode(string parentFullPath,string path,List<string> list)
- {
- TreeNode node = new TreeNode ();
- string[] segment = path.Split ('/');
- if (segment.Length > )
- {
- string name = segment[];
- node.name = name;
- node.nodeType = TreeNodeType.Switch;
- string fullPath = parentFullPath + name+"/";
- List<string> allChildrenPath = list.FindAll (s=>
- {
- if (s.StartsWith(fullPath) && s!=fullPath)
- {
- return true;
- }
- return false;
- }
- );
- List<string> dirList = new List<string> ();
- for (int i = ; i < allChildrenPath.Count; i++)
- {
- string childPath = allChildrenPath [i].Remove (, fullPath.Length);
- string[] childPathSegment = childPath.Split('/');
- if (childPathSegment.Length > ) {
- string childDirPath = childPathSegment [];
- if (!dirList.Contains (childDirPath)) {
- dirList.Add (childDirPath);
- TreeNode childNode = GenerateFileNode (fullPath, childDirPath + "/", list);
- node.InsertNode (childNode);
- }
- }
- else
- {
- TreeNode childNode = GenerateFileNode (fullPath, childPath, list);
- node.InsertNode (childNode);
- }
- }
- }
- else
- {
- node.name = path;
- node.nodeType = TreeNodeType.Item;
- list.Remove (path);
- }
- return node;
- }
- }
2:界面实现类(CreateTreeList)
- using UnityEngine;
- using UnityEditor;
- using System.Collections;
- using System.Collections.Generic;
- public class CreateTreeList:EditorWindow {
- private List<string> list = new List<string> ();
- private static TreeNode root = null;
- private TreeNode currentNode;
- private static CreateTreeList _instance = new CreateTreeList();
- private int treeIndex = ;
- private static CreateTreeList window; // 自定义窗体
- [MenuItem("H3D/构建树视图")]
- static void Init(){
- window = EditorWindow.GetWindow<CreateTreeList>(); // 创建自定义窗体
- window.titleContent = new GUIContent("构建树视图"); // 窗口的标题
- window.Show();
- _instance.GetAssets ();
- _instance.CreateTree ();
- // 创建树
- }
- // void Awake()
- // {
- // Debug.Log ("Awake");
- // }
- void Start()
- {
- Debug.Log ("Start");
- }
- // void Update()
- // {
- // Debug.Log ("Update");
- // }
- private void GetAssets()
- {
- list.Clear ();
- list.Add ("生物/动物");
- list.Add ("生物/动物/宠物/猫");
- list.Add ("生物/动物/宠物/狗");
- // list.Add ("生物/动物/野生/老虎");
- // list.Add ("生物/动物/野生/狮子");
- list.Add ("生物/植物");
- list.Add ("生物/植物/蔬菜/白菜");
- list.Add ("生物/植物/蔬菜/萝卜");
- // list.Add ("生物/植物/水果/苹果");
- // list.Add ("生物/植物/水果/橘子");
- Debug.Log ("获取数据完成");
- }
- private void CreateTree()
- {
- root = TreeNode.Get ().GenerateFileTree (list);
- Debug.Log ("生成文件树完成");
- // ShowFileTree (root, 0);
- // Debug.Log ("显示文件树完成");
- }
- private void ShowFileTree(TreeNode node, int level)
- {
- string prefix = "";
- for (int i = ; i < level; i++)
- {
- prefix += "~";
- }
- Debug.Log (prefix + node.name);
- if (node == null || node.children == null)
- {
- return;
- }
- for (int i = ; i < node.children.Count; i++)
- {
- ShowFileTree (node.children[i], level+);
- }
- }
- private void DrawFileTree(TreeNode node, int level)
- {
- if (node == null)
- {
- return;
- }
- GUIStyle style = new GUIStyle();
- style.normal.background = null;
- style.normal.textColor = Color.white;
- if (node == currentNode)
- {
- style.normal.textColor = Color.red;
- }
- Rect rect = new Rect(+*level, +*treeIndex, node.name.Length*, );
- treeIndex++;
- if (node.nodeType == TreeNode.TreeNodeType.Switch) {
- node.isOpen = EditorGUI.Foldout (rect, node.isOpen, node.name, true);
- }
- else
- {
- if (GUI.Button (rect, node.name, style))
- {
- Debug.Log (node.name);
- currentNode = node;
- }
- }
- if (node==null || !node.isOpen || node.children == null)
- {
- return;
- }
- for (int i = ; i < node.children.Count; i++)
- {
- DrawFileTree (node.children[i], level+);
- }
- }
- void OnGUI()
- {
- treeIndex = ;
- DrawFileTree (root, );
- }
- }
效果图:
(点击后,被点击的节点红色显示,并在控制台输出被点击的节点的名字)
unity editor 折叠树的更多相关文章
- 帆软报表(finereport) 折叠树
在进行展现数据时,希望模板的数据是可以动态折叠的,即点击数据前面的加号才展开对应下面的数据,可通过树节点按钮实现折叠树效果 实现思路: 1.这里建立一个内置数据集 添加数据 设置模板样式,添加颜色和对 ...
- Spine用于Timeline(NullReferenceException: Object reference not set to an instance of an object pine.Unity.Editor.AnimationReferenceAssetEditor.OnInspectorGUI ())
报错信息:Spine.Unity.Editor.AnimationReferenceAssetEditor.OnInspectorGUI () (at Assets/Extention/Spine/E ...
- Unity Editor 下创建Lua和Text文件
预览 在Project视图中,扩展右键菜单,右键 – Create - Text File 创建一个Text文件,或者Lua文件. 关键点 获取当前选择的路径,以Assets路径开头 var sele ...
- Unity Editor已停止工作
在更换系统之后,可能会出现打开刚安装好的Unity,显示Unity Editor已停止工作,这时候我们考虑是系统win7的问题.可以在原系统上升级,也可以重新安装,升级.文中所涉及到的软件,可在右侧加 ...
- vue 仿zTree折叠树
需求: vue实现仿zTree折叠树,此文章仅作为记录文档. 实现: <template> <div class="line-tree"> <div ...
- 编写 Unity Editor 插件
Editor Style Viewer 在开发过程中,我喜欢编写一些辅助的Editor插件,方便在游戏开发过程进行调试. 下面是摘自Asset Store的一个查看Unity 默认GUI样式的小工具 ...
- [Editor]Unity Editor类常用方法
Editor文档资料 Unity教程之-Unity Attribute的使用总结:http://www.unity.5helpyou.com/3550.html 利用unity3d属性来设置Inspe ...
- [cb] Unity Editor 添加右键菜单
需求 为Unity的Editor窗口添加右键菜单 实现代码 // This example shows how to create a context menu inside a custom Edi ...
- unity Editor的使用
1.首先定义一个需要控制数值的类,类中定义若干个变量 using UnityEngine;using System.Collections; using UnityEngine; using Syst ...
随机推荐
- python-xss攻击和单例模式
1.python中单例模式 class Foo: instance = None def __new__(cls, *args, **kwargs): if not Foo.instance: Foo ...
- DRF之三大认证
一.用户认证Authorticatons 1.源码解析 第一步. 找入口 def dispatch(self, request, *args, **kwargs): # 1.首先我们进入的是APIVi ...
- ## ucore Lab0 一些杂记
ucore Lab0 一些杂记 前一阵子开始做 MIT 6.828,做了两三个实验才发现清华的 ucore 貌似更友好一些,再加上前几个实验也与6.828 有所重叠,于是决定迁移阵地. 文章计划分两类 ...
- 【转】UBOOT——启动内核
转自:https://www.cnblogs.com/biaohc/p/6403863.html 1:什么是UBOOT,为什么要有UBOOT? UBOOT的主要作用是用来启动linux内核,因为CPU ...
- ubuntu 安装nvidia driver
错误的命令:sudo apt-get install nvidiar-430好多教程都是这样 sudo apt-get install nvidia-driver-430 很奇怪这个命令变成这样 h ...
- moc_XXXX.o:(.data.rel.ro._ZTI12CalculatorUI[_ZTI12CalculatorUI]+0x10): undefined reference to `typeinfo for QWidget' collect2: error: ld returned 1 exit status make: *** [Makefile:144: myCalculator]
main.cpp:(.text.startup+0x22): undefined reference to `QApplication::QApplication(int&, char**, ...
- python笔记(2)--字符串
一.创建字符串 使用 '' , "" , ''' 和 """ 来创建字符串 var1 = 'hello, world' var2 = "ja ...
- css将两个元素水平对齐,兼容IE8
css实现元素水平对齐 css实现水平对齐,如图 有人会说css实现这种水平对齐要兼容ie8还不简单吗?使用float: left,或者display: inline-block,不就可以了吗?是的, ...
- 常见BUG
1.没有配置Tomcat服务,由于 <exclusions> <exclusion> <groupId>org.springframework.boot</g ...
- IDEA unable to find valid certification path to requested target
一.报错 Could not transfer artifact org.apache.maven.plugins:maven-install-plugin:pom:2.4 from/to alima ...