~~~~
以此文向劳动致敬
层级是一个场景里面的游戏对象的目录形式,正常的层级:
加了特效之后的层级:
Duang Duang Duang ~~~
加了特效之后与与原层级的区别:
- 在层级中控制游戏对象的Active(显示隐藏)状态
- 游戏对象的各种状态显示
- 更清楚的游戏对象层次
- 控制游戏对象的可编辑状态
- 等等等等。。
切入
主题:如何进入绘制,代码入口API在哪里,别急,先把问题分析进行剖析:
- 上图中五颜六色的图标不是程序写出来的,是美术图标,得准备素材。
- 应用面象对象的思考方式,层级不是一下子绘制出来的,是一个对象一个对象的来的。
- 应该准确的取得绘制的坐标
关于图标上再加入事件这些问题,解决了首要问题,那就迎刃而解了。
找API什么的最好的方式就是看别人已经有的代码,层级回调主要来自这个委托
EditorApplication.hierarchyWindowItemOnGUI
public delegate void HierarchyWindowItemCallback(int instanceID, Rect selectionRect);
委托返回一个instanceID,此为游戏对象ID,Rect就是游戏对象在层级的绘制的区域,也就是说我们能找到需要的绘制图标的坐标。
有这了个id,就可以取到游戏对象,有了游戏对象,就可以取得与修改这个游戏对象的各种参数。
上代码前,先截个图
很多脚本是我写其它工具时的,由于层级我也想写成工具,所以就放一起了,请无视。
如上图所示,先写一个取图标的方法:新建一个脚本 KMHierarchy ,如上图在Editor目录之下,系统引用加入:
1 |
using System.IO; |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public static Texture2D GetTexture2D(string id) { Texture2D result; string path = "Assets/_Scripts/Editor/Images/" + id + ".png"; var ba = File.ReadAllBytes(path); result = new Texture2D(4, 4, TextureFormat.ARGB32, false) { hideFlags = HideFlags.HideAndDontSave }; result.LoadImage(ba); return result; } |
另外为了方便,我封装了一个关于Rect的类:新建一静态类,最好放在Plugins目录下,这样编辑器和游戏主代码都可以访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using UnityEngine; /// <summary> /// 提供于Rect的便用方法 /// </summary> public static class KMRect { /// <summary> /// Hierarchy 里面从右往左数的位置 /// </summary> static public Rect H_CR(this Rect rect, int index = 1, int offectX = 0) { int dis = 2 * index; rect.x += rect.width - index * rect.height - dis - offectX; return H_Size(rect); } /// <summary> /// 重置定义Rect的大小 /// </summary> static public Rect H_Size(this Rect rect, int width = 16, int height = 16) { rect.size = new Vector2(width, height); return rect; } } |
准备工作完毕,开始代码主体:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
using UnityEngine; using UnityEditor; using System.Collections; using System.IO; /// <summary> /// Hierarchy 外观控制显示 /// </summary> [InitializeOnLoad] public class KMHierarchy { static KMHierarchy() { EditorApplication.hierarchyWindowItemOnGUI += HierarchyItemCB; } private static void HierarchyItemCB(int instanceID, Rect selectionRect) { var go = EditorUtility.InstanceIDToObject(instanceID) as GameObject; if (go == null) return; //Texture2D tex = KMGUI.blankTexture; //GetTexture2D("eye"); Rect eyeRect = selectionRect.H_CR(); GUI.DrawTexture(eyeRect, GetTexture2D("eye")); if (GUI.Button(eyeRect, "", EditorStyles.label)) { Debug.Log("Eye to me!"); } Rect childRect = selectionRect.H_CR(2, 0).H_Size(24); GUI.Label(childRect, "" + go.transform.childCount, EditorStyles.label); if (GUI.Button(childRect, "", EditorStyles.label)) { Debug.Log("child count for button"); } } public static Texture2D GetTexture2D(string id) { Texture2D result; string path = "Assets/_Scripts/Editor/Images/" + id + ".png"; var ba = File.ReadAllBytes(path); result = new Texture2D(4, 4, TextureFormat.ARGB32, false) { hideFlags = HideFlags.HideAndDontSave }; result.LoadImage(ba); return result; } } |
类上边的
1 |
[InitializeOnLoad] |
必须加入,不然不会走方法
1 2 3 4 5 |
这句代表我要绘制的图片,字符串同理 GUI.DrawTexture(eyeRect, GetTexture2D("eye")); 第三个参数代表我不想用Unity的Button边框进行绘制,因为很丑,if语句里面还能写事件 if (GUI.Button(eyeRect, "", EditorStyles.label)) |
先到这里吧
下次就把具体的方法给写上,收缩子对象禁止编辑应该是一个重要的研究方向。
赞
么么哒土豪哥。