码迷,mamicode.com
首页 > 编程语言 > 详细

Unity处理Hierarchy面板上的一些特殊的对象的特殊标识

时间:2015-05-27 10:04:51      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:3d   c#   unity   ugui   

孙广东  2015.5.27

转载请注明出处:http://blog.csdn.net/u010019717

要实现下面的效果:、其实主要是要标识一些比较特殊的对象(或者是具有特殊组件的对象)

技术分享

实现方式就是监听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);
            }

        }

    }
}

Unity处理Hierarchy面板上的一些特殊的对象的特殊标识

标签:3d   c#   unity   ugui   

原文地址:http://blog.csdn.net/u010019717/article/details/46042071

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!