Unity编辑器拓展之十二:预制体层级全预览

博客迁移

个人博客站点,欢迎访问,www.jiingfengji.tech

预制体层级全预览

目的

Asset面板下预制体并不会显示全,制作一个工具显示预制体的全部层级,这算是TreeView的一个应用

Unity编辑器拓展之十二:预制体层级全预览_第1张图片

Code

代码中用了Unity编辑器拓展之十一:通过Image Name反查Prefab
中的一个类PrefabTreeView

using System.Collections;
using System.Collections.Generic;
using UnityEditor.IMGUI.Controls;
using UnityEngine;

public class GameObjectTreeViewItem {
    public TreeViewItem viewItem;
    public Transform treeViewTrans;
    public Transform parent;
    public List childs = new List ();

    public bool IsChild (Transform tran) {
        if (null == tran) return false;
        if (tran.parent == treeViewTrans) return true;
        return false;
    }

    public void AddChildTransform (Transform childTransform) {
        if (null != childTransform)
            childs.Add (childTransform);
    }

    public bool HasChildTransform (Transform tran) {
        if (null == tran) return false;
        return childs.Contains (tran);
    }
}

public class PrefabTreeView : TreeView {
    private Transform[] childs;
    private GameObjectTreeViewItem[] items;
    public PrefabTreeView (TreeViewState state, GameObject go) : base (state) {
        if (go != null)
        {
            treeGameObject = go;
            childs = treeGameObject.GetComponentsInChildren (true);
            items = new GameObjectTreeViewItem[childs.Length];
            #region Init Items Parent
            for (int i = 0; i < childs.Length; i++) {
                items[i] = new GameObjectTreeViewItem ();
                items[i].treeViewTrans = childs[i];
                if (childs[i].parent != null)
                    items[i].parent = childs[i].parent;
            }
            #endregion

            #region Init Child Transform
            for (int i = 0; i < childs.Length; i++) {
                for (int j = 0; j < items.Length; j++) {
                    if (items[j].IsChild (childs[i])) {
                        items[j].AddChildTransform (childs[i]);
                        break;
                    }
                }
            }
            #endregion
        }
        else
        {
            childs = null;
            items = null;
        }
        Reload ();
    }

    private GameObject treeGameObject;

    private GameObjectTreeViewItem GetGameObjectTreeViewItem (GameObjectTreeViewItem[] items, Transform trans) {
        if (null == items || items.Length == 0 || trans == null)
            return null;
        for (int i = 0; i < items.Length; i++) {
            if (items[i] != null && items[i].treeViewTrans == trans)
                return items[i];
        }
        return null;
    }

    private GameObjectTreeViewItem GetGameObjectTreeViewItem (GameObjectTreeViewItem[] items, TreeViewItem viewItem) {
        if (null == items || items.Length == 0 || viewItem == null)
            return null;
        for (int i = 0; i < items.Length; i++) {
            if (null != items && items[i].viewItem == viewItem)
                return items[i];
        }
        return null;
    }

    protected override TreeViewItem BuildRoot () {
        
        TreeViewItem root = new TreeViewItem { id = 0, depth = -1, displayName = "root" };
        if (childs != null && items != null)
        {
            TreeViewItem[] childItems = new TreeViewItem[childs.Length];
            for (int i = 0; i < childs.Length; i++)
            {
                childItems[i] = new TreeViewItem {id = i + 1, displayName = childs[i].name};
                GameObjectTreeViewItem item = GetGameObjectTreeViewItem(items, childs[i]);
                if (null != item)
                {
                    item.viewItem = childItems[i];
                }
            }

            root.AddChild(childItems[0]);
            for (int i = 0; i < childItems.Length; i++)
            {
                GameObjectTreeViewItem temp = GetGameObjectTreeViewItem(items, childItems[i]);
                if (temp != null && temp.childs != null)
                {
                    for (int j = 0; j < temp.childs.Count; j++)
                    {
                        GameObjectTreeViewItem childItem = GetGameObjectTreeViewItem(items, temp.childs[j]);
                        if (childItem != null && childItem.viewItem != null)
                        {
                            childItems[i].AddChild(childItem.viewItem);
                        }
                    }
                }
            }
        }


        SetupDepthsFromParentsAndChildren (root);
        return root;
        
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.IMGUI.Controls;
using UnityEngine;

public class PrefabViewWindow : EditorWindow {

	private GameObject selectPrefab = null;
	[SerializeField]
	TreeViewState treeViewState;
	PrefabTreeView prefabTreeView;

	void OnEnable () {
		if (null == treeViewState)
			treeViewState = new TreeViewState ();
		if (selectPrefab != null)
			prefabTreeView = new PrefabTreeView(treeViewState, selectPrefab);
		else prefabTreeView = null;
	}

	[MenuItem ("PrefabView/PrefabViewWindow")]
	private static void ShowWindow () {
		GetWindow ().Show ();
	}

	private void OnGUI () {
		if (null != selectPrefab && prefabTreeView != null) {
			Rect rect = GUILayoutUtility.GetRect (0, 100000, 0, 100000);
			prefabTreeView.OnGUI (rect);
		}
	}

	void OnSelectionChange ()
	{
		GameObject curSelectPrefab = Selection.activeObject as GameObject;
		if (curSelectPrefab == null) return;
		if (curSelectPrefab != selectPrefab)
		{
			selectPrefab = Selection.activeObject as GameObject;
			prefabTreeView = new PrefabTreeView(treeViewState,selectPrefab);
		}
        Repaint();
	}
}

Code下载

https://github.com/JingFengJi/PrefabViewWindow

以上知识分享,如有错误,欢迎指出,共同学习,共同进步。

你可能感兴趣的:(编辑器,Unity,Unity编辑器拓展)