注意
- 编辑器代码应放置在合理的Editor中。
- 使用AssemblyDefinition应注意设置生效平台仅Editor。
主要API
EditorApplication.hierarchyWindowItemOnGUI
用于层级窗口元素gui绘制回调。EditorUtility.InstanceIDToObject(instanceId)
通过实例ID获取对象。InitializeOnLoad
允许在 Unity 加载时和重新编译脚本时初始化 Editor 类。
案例一
在层级视图通过色块显示当前项是否激活
主要API
go.activeInHierarchy
是否在层级视图激活,子物体会受父级状态所影响。
代码
using UnityEditor;
using UnityEngine;
/// <summary>
/// 允许在 Unity 加载时和重新编译脚本时初始化 Editor 类
/// </summary>
[InitializeOnLoad]
public class HierarchyDrawEditor
{
static HierarchyDrawEditor()
{
EditorApplication.hierarchyWindowItemOnGUI -= HierarchyIconsOnGUI;
EditorApplication.hierarchyWindowItemOnGUI += HierarchyIconsOnGUI;
}
static void HierarchyIconsOnGUI(int instanceId, Rect selectionRect)
{
//通过InstanceID获取对象
var go = (GameObject)EditorUtility.InstanceIDToObject(instanceId);
if (go)
{
Rect rect = selectionRect;
rect.x += selectionRect.width - 20;
rect.width = 20;
///activeInHierarchy,用于自身是否在层级视图激活
GUI.color = go.activeInHierarchy ? Color.green : Color.red;
GUI.Box(rect,"");
//恢复GUI默认色
GUI.color = Color.white;
}
}
}
案例二
在层级视图增加一个快速删除游戏对象的按钮。
主要API
Undo.DestroyObjectImmediate(go);
可撤销的删除操作。AssetDatabase.LoadAssetAtPath<Texture2D>("Packages/你的包名/Editor/icons/delete.png");
在UPM包内的相对路径加载。
代码
using UnityEditor;
using UnityEngine;
/// <summary>
/// 允许在 Unity 加载时和重新编译脚本时初始化 Editor 类
/// </summary>
[InitializeOnLoad]
public class HierarchyDrawEditor
{
static Texture2D deleteicon;
static HierarchyDrawEditor()
{
EditorApplication.hierarchyWindowItemOnGUI -= HierarchyIconsOnGUI;
EditorApplication.hierarchyWindowItemOnGUI += HierarchyIconsOnGUI;
//如果你使用的是UPM包的话请使用Packages/你的包名/相对路径
//deleteicon = AssetDatabase.LoadAssetAtPath<Texture2D>("Packages/cn.mypackage/Editor/icons/delete.png");
//提前读取对应的删除图标
deleteicon = AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/Editor/icons/delete.png");
}
static void HierarchyIconsOnGUI(int instanceId, Rect selectionRect)
{
//通过InstanceID获取对象
var go = (GameObject)EditorUtility.InstanceIDToObject(instanceId);
if (go)
{
Rect rect = selectionRect;
rect.x += selectionRect.width - 20;
rect.width = 20;
if (GUI.Button(rect, ""))
{
//这里使用的是Undo下的删除,主要目的是删除后可以Ctrl+Z进行撤销
Undo.DestroyObjectImmediate(go);
}
//这里目的是让删除图标显示更大些,不嫌麻烦也可以制作个样式给按钮。
GUI.Label(rect, deleteicon);
}
}
}