首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >零基础入门 41:Hierarchy也可以这样玩

零基础入门 41:Hierarchy也可以这样玩

作者头像
韩东吉
发布2018-10-16 11:00:31
9550
发布2018-10-16 11:00:31
举报

上一篇给大家说了下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;

}

}

}

}

}

}

好了,大家下期分享见~~~~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 韩东吉的Unity杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档