一、拓展菜单
//Hierarchy视图拓展
[MenuItem("GameObject/My Create/Cube",false,0)]
static void CreateCube()
{
GameObject.CreatePrimitive(PrimitiveType.Cube);//建立立方体
}
拓展原理是重写MenuItem的自定义路径,Create按钮下的菜单项都在GameObject下,所以只要开头是GameObject/xxx/xxx,均可自由拓展。
二、拓展布局
[InitializeOnEnterPlayMode]//用于在进入播放模式时重置编辑器类中的静态字段,而无需重新加载域。
static void InitializeOnEnterPlayMode()
{
//Hierarchy 窗口中每个可见列表项的 OnGUI 事件的委托。
EditorApplication.hierarchyWindowItemOnGUI = delegate (int instanceID, Rect selectionRect)
{
//在Hierarchy视图中选择一个资源
//Selection.activeGameObject 返回处于活动状态的游戏对象
if (Selection.activeGameObject && instanceID == Selection.activeGameObject.GetInstanceID())
{
float width = 50f;
float height = 20f;
selectionRect.x += (selectionRect.width - width);//左边界位置
selectionRect.width = width;//宽度
selectionRect.height = height;//高度
//public static bool Button (Rect position, string text);
//position 屏幕上用于按钮的矩形。
//text 要在按钮上显示的文本。 //⬇️路径下确保有图片
if (GUI.Button(selectionRect, AssetDatabase.LoadAssetAtPath<Texture>("Assets/bufeng.jpg")))
{
//AssetDatabase.LoadAssetAtPath 返回给定路径 assetPath 下 type 类型的第一个资源对象。
Debug.LogFormat("click : {0}", Selection.activeGameObject.name);
}
}
};
}
代码中实现了EditorApplication.hierarchyWindowItemOnGUI 委托,就可以重写hierarchy视图了。
效果图如下:
三、重写菜单
[MenuItem("Window/Test/yusong")]
static void Test()
{
}
[MenuItem("Window/Test/momo")]
static void Test1()
{
}
[MenuItem("Window/Test/测试/MOMO")]
static void Test2()
{
}
[InitializeOnLoadMethod]//允许在 Unity 加载时初始化编辑器类方法,而无需用户执行任何操作。
static void StartInitializeOnLoadMethod()
{
//Hierarchy 窗口中每个可见列表项的 OnGUI 事件的委托。
EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyGUI;
}
static void OnHierarchyGUI(int instanceID, Rect selectionRect)
{
//Event.current 将被立即处理的当前事件。selectionRect.Contains 返回某个对象是否包含在当前选择中。EventType.MouseUp 释放了鼠标键。
if (Event.current!=null && selectionRect.Contains(Event.current.mousePosition)&&Event.current.button==1 && Event.current.type<=EventType.MouseUp)//监听鼠标抬起事件
{
// EditorUtility.InstanceIDToObject 将实例 ID 转换为对对象的引用。
GameObject selectedGameObject = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
if (selectedGameObject)
{
Vector2 mousePosition = Event.current.mousePosition;//鼠标坐在位置
// Rect 由 X 和 Y 位置、宽度以及高度定义的 2D 矩形。EditorUtility.DisplayPopupMenu 显示弹出菜单。
EditorUtility.DisplayPopupMenu(new Rect(mousePosition.x, mousePosition.y, 0, 0), "Window/Test", null);//用于弹出自定义菜单
Event.current.Use();
}
}
}
Event.current获取当前事件,当监听到鼠标抬起事件并且满足游戏对象选中状态,则开始执行自定义事件。
EditorUtility.DisplayPopupMenu 用于弹出自定义菜单