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 > 0) { for (int i = 0; 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 > 1) { string name = segment[0]; 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 = 0; i < allChildrenPath.Count; i++) { string childPath = allChildrenPath [i].Remove (0, fullPath.Length); string[] childPathSegment = childPath.Split('/'); if (childPathSegment.Length > 1) { string childDirPath = childPathSegment [0]; 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 = 0; 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 = 0; i < level; i++) { prefix += "~"; } Debug.Log (prefix + node.name); if (node == null || node.children == null) { return; } for (int i = 0; i < node.children.Count; i++) { ShowFileTree (node.children[i], level+1); } } 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(5+20*level, 5+20*treeIndex, node.name.Length*25, 20); 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 = 0; i < node.children.Count; i++) { DrawFileTree (node.children[i], level+1); } } void OnGUI() { treeIndex = 0; DrawFileTree (root, 0); } }
效果图:
(点击后,被点击的节点红色显示,并在控制台输出被点击的节点的名字)