Unity 折叠树 EditorGUI.Foldout
下面给大家介绍下折叠树EditorGUI.Foldout,在使用折叠树EditorGUI.Foldout时,还需要两个类:树节点类和界面实现类:
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;
- }
- }
- 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);
- }
- }