UnityはHierarchyパネルの特殊なオブジェクトの特殊な識別を処理します.


孫広東2015.5.27
転載は出典を明記してください.http://blog.csdn.net/u010019717  
   
次の効果を実現するには、主に特殊なオブジェクト(または特殊なコンポーネントを持つオブジェクト)を識別します.
Unity处理Hierarchy面板上的一些特殊的对象的特殊标识_第1张图片
実装方法はUnityのいくつかのイベントを傍受することです
  EditorApplication.hierarchyWindowChanged += HierarchyWindowChanged; EditorApplication.hierarchyWindowItemOnGUI += HierarchyWindowItemOnGUI;
このクラスがAssetPostprocessorの派生クラスであることを示す必要があります.
リソースインポート後の処理クラスは、ここであまり時間のかかる操作を行わないほうがいいです.そうしないと、Unityエディタはカートンします.プリコンパイルとインポート処理を実行してエディタの右下隅に小さな円があってから、長い間カートンに移籍します.
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using DajiaGame.Px;
using UnityEditor;

/// <summary>
///         
/// 
///           Hierarchy                
/// </summary>
public class PxCustomHierarchy : AssetPostprocessor
{
    /// <summary>
    ///         
    /// </summary>
    public static class Icons
    {
        public static Texture2D poseBones;
        public static Texture2D image;
        public static Texture2D boundingBox;
        public static Texture2D mesh;
        public static Texture2D warning;


        public static void Initialize()
        {
            poseBones = (Texture2D)AssetDatabase.LoadMainAssetAtPath(SpineEditorUtilities.editorGUIPath + "/icon-poseBones.png");
            image = (Texture2D)AssetDatabase.LoadMainAssetAtPath(SpineEditorUtilities.editorGUIPath + "/icon-image.png");
            boundingBox = (Texture2D)AssetDatabase.LoadMainAssetAtPath(SpineEditorUtilities.editorGUIPath + "/icon-boundingBox.png");
            mesh = (Texture2D)AssetDatabase.LoadMainAssetAtPath(SpineEditorUtilities.editorGUIPath + "/icon-mesh.png");
            warning = (Texture2D)AssetDatabase.LoadMainAssetAtPath(SpineEditorUtilities.editorGUIPath + "/icon-warning.png");
        }
    }

    //   
    public static string editorPath = "";
    public static string editorGUIPath = "";
    static Dictionary<int, GameObject> skeletonRendererTable;
    static Dictionary<int, Canvas> CanvasTable;
    public static float defaultScale = 0.01f;
    public static float defaultMix = 0.2f;
    public static string defaultShader = "Spine/Skeleton";
    public static bool initialized;

    const string DEFAULT_MIX_KEY = "SPINE_DEFAULT_MIX";

    //       
    static PxCustomHierarchy()
    {
		Initialize();
	}

	static void Initialize () {
		defaultMix = EditorPrefs.GetFloat(DEFAULT_MIX_KEY, 0.2f);

		DirectoryInfo rootDir = new DirectoryInfo(Application.dataPath);
		FileInfo[] files = rootDir.GetFiles("SpineEditorUtilities.cs", SearchOption.AllDirectories);
		editorPath = Path.GetDirectoryName(files[0].FullName.Replace("\\", "/").Replace(Application.dataPath, "Assets"));
		editorGUIPath = editorPath + "/GUI";

		Icons.Initialize();

        CanvasTable = new Dictionary<int, Canvas>();

		EditorApplication.hierarchyWindowChanged += HierarchyWindowChanged;
		EditorApplication.hierarchyWindowItemOnGUI += HierarchyWindowItemOnGUI;

		HierarchyWindowChanged();
		initialized = true;
	}

    static void HierarchyWindowChanged()
    {
        CanvasTable.Clear();

        Canvas[] boneArr = Object.FindObjectsOfType<Canvas>();
        foreach (Canvas b in boneArr)
            CanvasTable.Add(b.gameObject.GetInstanceID(), b);
    }

    /// <summary>
    ///         ,      
    /// </summary>
    /// <param name="instanceId"></param>
    /// <param name="selectionRect"></param>
    static void HierarchyWindowItemOnGUI(int instanceId, Rect selectionRect)
    {
        if (CanvasTable.ContainsKey(instanceId))
        {

            if (CanvasTable[instanceId].transform.root == CanvasTable[instanceId].transform)
            {
                //MyDebugLog.Log("     root:" + CanvasTable[instanceId].gameObject.name);
                Rect r = new Rect(selectionRect);
                r.x = r.width - 15;
                r.width = 15;

                GUI.Label(r, SpineEditorUtilities.Icons.poseBones);
            }
            else if (CanvasTable[instanceId] != null)
            {
                Rect r = new Rect(selectionRect);
                r.x -= 26;

                if (CanvasTable[instanceId].transform.childCount == 0)
                    r.x += 13;

                r.y += 2;

                r.width = 13;
                r.height = 13;

                GUI.DrawTexture(r, SpineEditorUtilities.Icons.poseBones);
            }

        }

    }
}