上一篇给大家说了下Inspector如何禁用RectTransform属性修改的做法,今天就来分享下对Hierarchy的另一种操作。
大家在平时的开发需求中,可能会有遇到这样的情况
①、在Hierarchy里,让原本默认显示的一些对象隐藏不显示,但是却真实存在,只不过在Hierarchy里是隐藏不可见的。
②、为Hierarchy里的对象增加一些特殊的文本标识或者显示状态
举个例子,如下图
然后隐藏原本存在的摄像机子对象2-4,注意这里是隐藏,实际真实存在
其中,状态的特殊显示可以如上图中的文本标识,也可以是一张图片,按钮,都可以。
那如何实现呢?
进入正题
和上一篇的准备工作基本一样,创建脚本然后放在Editor目录下,并且增加Using UnityEditor 和 [InitializeOnLoad]
然后
如上图所示,在构造函数中增加对EditorApplication的hierarchyWindowItemOnGUI事件监听。
然后完善监听接口
如上图所示,监听函数需要两个参数,分别为instanceId,还有selectionRect。
每一个游戏中的实例对象都有自己的唯一标识,即InstanceId,然后我们将InstanceId转换为Hierarchy里的游戏对象,并且判断是否存在摄像机组件以及是否是主摄像机,这些检索条件,大家可以根据自己的实际需求进行过滤。
然后对检索到的符合条件的对象增加新的Gui显示。其中通过SelectionRect构造了新的rect,并且绘制了GUI.Label。上述GUILabel的样式,即GUIStyle可以有很多种形式。包括颜色修改等。
对GUI.Label的操作也可以换成其他的如图片,按钮等形式。
然后在主摄像机下检索子对象的数目,因为我要过滤第一个,所以遍历索从1开始,然后把1-3的索引即第2到4个对象进行隐藏设置。
隐藏API为,hideFlags为HideInHierarchy,其他的设置为None即可。
以下动图可以展示这个创建过程。
我在MainCamera下创建了几个游戏对象,第2-3-4个游戏对象都是隐藏的,实际创建了,但是被隐藏在Hierarchy下。之后的才会看得见。
好了,今天的主题分享就到这里,上面的检索条件大家可以根据自己的实际需求来,记下主要的API即可
1、监听事件
2、通过InstacneId转换为游戏对象
3、将selectionRect构造新的rect,增加新的GUIStyle,来完善GUI的绘制显示
4、gameObject的HideFlags的设置。
最后全部代码附上
using UnityEngine;
using UnityEditor;
[InitializeOnLoad]
public class ChangeHierarchy : MonoBehaviour
{
static ChangeHierarchy()
{
EditorApplication.hierarchyWindowItemOnGUI += HierarchyItemOnGUI;
}
private static void HierarchyItemOnGUI(int instanceID, Rect selectionRect)
{
var obj = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
if (obj != null)
{
if (obj.GetComponent<Camera>() != null & obj.tag == "MainCamera")
{
Rect rect = new Rect(selectionRect);
rect.x = rect.width - 90;
rect.width = 100;
rect.y += 2;
var style = new GUIStyle();
style.normal.textColor = Color.green;
GUI.Label(rect, "[我是主摄像机]", style);
if (obj.transform.childCount > 0)
{
for (int i = 1; i < obj.transform.childCount; i++)
{
if (i >= 1 & i <= 3)
obj.transform.GetChild(i).gameObject.hideFlags = HideFlags.HideInHierarchy;
else
obj.transform.GetChild(i).gameObject.hideFlags = HideFlags.None;
}
}
}
}
}
}
好了,大家下期分享见~~~~