本文章里只是简单地总结各种比较少见的editor使用
IHasCustomMenu
Unity中的窗口都可以通过右键窗口的tab 或者 点击窗口右上角的一个菜单按钮 来显示窗口菜单项。窗口都有默认的菜单项。但可以通过实现 IHasCustomMenu 接口中的 AddItemsToMenu 函数 来添加自定义的菜单项。
public class AssetBundleBrowserMain : EditorWindow, IHasCustomMenu{
[MenuItem("Window/AssetBundle Browser", priority = 2050)]
static void ShowWindow()
{
var window = GetWindow<AssetBundleBrowserMain>();
window.titleContent = new GUIContent("AssetBundles");
window.Show();
}
[SerializeField]
public bool multiDataSource = false;
public virtual void AddItemsToMenu(GenericMenu menu)
{
//menu.AddSeparator(string.Empty);
menu.AddItem(new GUIContent("Custom Sources"), multiDataSource, FlipDataSource);
}
public void FlipDataSource()
{
multiDataSource = !multiDataSource;
}
}
也可以控制菜单选项的展示方式,比如在菜单上默认显示的锁头
using UnityEngine;
using UnityEditor;
public class WindowWithLockIcon : EditorWindow, IHasCustomMenu {
/// <summary>
/// Menu item to display our test window.
/// </summary>
[MenuItem("Window/Window with Lock Icon")]
static void Show() {
GetWindow<WindowWithLockIcon>("Lock Test");
}
/// <summary>
/// Keep local copy of lock button style for efficiency.
/// </summary>
[System.NonSerialized]
GUIStyle lockButtonStyle;
/// <summary>
/// Indicates whether lock is toggled on/off.
/// </summary>
[System.NonSerialized]
bool locked = false;
/// <summary>
/// Magic method which Unity detects automatically.
/// </summary>
/// <param name="position">Position of button.</param>
void ShowButton(Rect position) {
if (lockButtonStyle == null)
lockButtonStyle = "IN LockButton";
locked = GUI.Toggle(position, locked, GUIContent.none, lockButtonStyle);
}
/// <summary>
/// Adds custom items to editor window context menu.
/// </summary>
/// <remarks>
/// <para>This will only work for Unity 4.x+</para>
/// </remarks>
/// <param name="menu">Context menu.</param>
void IHasCustomMenu.AddItemsToMenu(GenericMenu menu) {
menu.AddItem(new GUIContent("Lock"), locked, () => {
locked = !locked;
});
}
}