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

孙广东  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);
            }

        }

    }
}
时间: 2024-10-13 17:08:15

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

一键展开关闭unity的 Inspector面板上的所有组件

孙广东  2015.12.11 using UnityEngine; using System.Collections.Generic; using System.Collections; using UnityEditor; using System.Reflection; using System; /// <summary> /// 描述:全部 展开/收起 Inspector面板的所有组件. /// author: 孙广东 /// todo 还可以深度定制,添加两个按钮切换 /// &l

egret中通过判断不同的类型来使同一个UI面板上显示不同的效果

点击不同按钮弹出同一个面板上的不同效果,通过传入类型来判断: this.btnRight.addEventListener(egret.TouchEvent.TOUCH_TAP,this.onUpgradeforgift,this); this.btnLeft.addEventListener(egret.TouchEvent.TOUCH_TAP,this.onPayforgift,this); private onUpgradeforgift(evt:egret.TouchEvent){ ma

ADO面板上的控件简介

ADO面板上的控件简介 一. TADOConnection组件该组件用于建立数据库的连接.ADO的数据源组件和命令组件可以通过该组件运行命令及数据库中提取数据等.该组件用于建立数据库的连接,该连接可被多个数据集所共享,但是并不是应用程序中必须的,因为ADO数据集及命令组件通过设置其ConnectionString属性,可以直接连接到数据库.但是如果多个数据集使用相同的数据库连接时,则使用TADOConnection就有一定的优势,因为不必为每个数据集都单独建立数据库的连接,同时也减少了资源的消耗

Unity3D开发之查找面板上某个脚本(包括Missing)

原地址:http://blog.csdn.net/lihandsome/article/details/24265411 有时候我们需要知道某个脚本在场景上面哪里用到,或者那个脚本被删除了但又没有把相关游戏场景的关联东西删掉,那样我们就要一个脚本来查找一下了: PS:下面两个脚本都要放到assets/Editor下面哦.. 查找missing的脚本: [csharp] view plaincopy using UnityEngine; using UnityEditor; public clas

Delphi7 ADO面板上的控件简介

Delphi7 ADO面板上的控件简介 一. TADO Connection组件 该组件用于建立数据库的连接.ADO的数据源组件和命令组件可以通过该组件运行命令及数据库中提取数据等. 该组件用于建立数据库的连接,该连接可被多个数据集所共享,但是并不是应用程序中必须的,因为ADO数据集及命令组件通过设置其Connection String属性,可以直接连接到数据库.但是如果多个数据集使用相同的数据库连接时,则使用TADO Connection就有一定的优势,因为不必为每个数据集都单独建立数据库的连

【Unity】3.1 利用内置的3D对象创建三维模型

分类:Unity.C#.VS2015 创建日期:2016-04-02 一.基本概念 Unity已经内置了一些基本的3D对象,利用这些内置的3D对象就可以直接构建出各种3D模型(当然,复杂的三维模型还需要借助专业建模软件来完成). Unity 5.3.4内置的3D对象有: Cube:立方体 Sphere:球体 Capsule:胶囊体. Cylinder:圆柱体. Plane:平面. Quad:四方格. Ragdoll:布娃娃系统. Terrain:地形. Tree:树. Wind Zone:风.

Unity定制,将属性暴露在Inspector面板上

孙广东   2015.7.12 Unity的很多编辑器功能都是通过特性Attribute实现. 那么我们要自己扩展Inspector也是要自己写Attribute. 先说说为什么要这样做? 为了编写面向对象程序,封装特性 更优雅.下面的脚本使 属性 (即有 getter/setter 的成员) 的内容可以在Unity的Inspector上显示.这样就可以保密类的 字段,并限制所有的外部访问,只能通过 属性 访问, 看看代码吧! using System; [AttributeUsage(Attr

unity小工具 在编辑器面板上显示文件和文件夹的大小

显示效果 代码部分如下: #if UNITY_EDITOR using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEngine; public static class FileCapacity { private const string REMOVE_STR = "Assets"; private const string FILESIZE = "FileSize&

(翻译)Unity中,在Terrain上绘制网格

Draw grid on the terrain in Unity Jan 23, 2015 Drawing grid on the terrain is used in lot of game genres – RTS, Simulation, Tower defense, etc. It can be done very easily in Unity. Here is some very simple extensible solution with following features: