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);
    }
}

 

效果圖:

 

(點擊后,被點擊的節點紅色顯示,並在控制台輸出被點擊的節點的名字)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM