Unity 编辑器扩展菜单

Unity 编辑器扩展菜单

一、MenuItem 特性 菜单栏扩展

MenuItem(string itemName, bool isValidateFunction, int priority) 
itemName:菜单名称路径 
isValidateFunction:不写为falsetrue则点击菜单前就会调用 
priority:菜单项显示排序 默认 1000

每个方法可以使用多个 MenuItem 来创建多个菜单

特殊路径:

CONTEXT: 为组件添加菜单项

Assets: 对应顶部菜单 Assets,并添加 Project 面板右键菜单

GameObject: 对应顶部菜单 GameObject,priority 值在1~49时,添加 Hierarchy 面板右键菜单

Component: 对应顶部菜单 Component,对应 Inspector 面板的 Add Component 窗口。但是不知道怎么用,用 AddComponentMenu 吧

1.创建多级菜单

[MenuItem("一级目录名/二级目录名/.../菜单名")]
static void 方法名()
{
    
    
	//实现功能
}

[MenuItem("Menu/menu1/menu2")]
static void Menu()
{
    
    
	Debug.Log("多级菜单");
}

2.创建可使用快捷键的菜单项

在 MenuItem 的双引号菜单路径最后+空格+快捷键字符

常用快捷键

  • Shift : #
  • Ctrl : %
  • Alt : &
  • 英文字母 :_字母 (不区分大小写)

快捷键可任意组合使用

[MenuItem("Menu/menu1/menu2 %#_A")]
static void Menu()
{
    
    
	Debug.Log("快捷键");
}

3.创建可被勾选的菜单项

使用 Menu 类的方法

//设置勾选状态
Menu.SetChecked(string menuPath,bool isChecked)
//获取勾选状态
Menu.GetChecked(string menuPath)
    
[MenuItem("Menu/menu2")]
static void Menu2()
{
    
    
	string menuPath = "Menu/menu2";
	bool isChecked = !Menu.GetChecked(menuPath);
	Menu.SetChecked(menuPath, isChecked);
    Debug.Log("可勾选" + isChecked);
}

4.检查菜单是否使用

每次点击一级菜单时 都是先走一遍验证方法

[MenuItem("菜单路径名")]
static void 方法1(){
    
    }
[MenuItem("菜单路径名"),true]
static void 验证方法()
{
    
    
    return bool; //返回true 改菜单启用
}

[MenuItem("Menu/menu2")]
static void Menu2()
{
    
    
	string menuPath = "Menu/menu2";
	bool isChecked = !Menu.GetChecked(menuPath);
	Menu.SetChecked(menuPath, isChecked);
	EditorPrefs.SetBool("Menu3Validate", isChecked);
	Debug.Log("可勾选" + isChecked);
}
[MenuItem("Menu/menu3")]
static void Menu3(){
    
    }
[MenuItem("Menu/menu3", true)]
static bool Menu3Validate()
{
    
    
	bool flag = EditorPrefs.GetBool("Menu3Validate");
	Menu.SetChecked("Menu/menu2", flag);
	return flag;
}

5.菜单排序

priority 小的位置在上方 不配置默认为1000

当相邻两个菜单的 priority 值差距超过10时 就会分组 中间出现一条横线

多级菜单的 priority 按照子级里面最小的 priority 算

MenuItem(string itemName, bool isValidateFunction, int priority) 

[MenuItem("Menu/menu1/menu2", false, 16)]
[MenuItem("Menu/menu1/menu3 %#_D", false, 5)]

6.右键菜单扩展

Hierarchy 和 Project 右键扩展属于特殊的菜单栏扩展

Hierarchy 右键菜单

Hierarchy 右键菜单是菜单栏的 GameObject 菜单栏下的菜单,并且 priority 在 1~49 范围内

[MenuItem("GameObject/菜单路径名",false,1)]
static void 方法名()
{
    
    
}

Project 右键菜单

Project 右键菜单是菜单栏的 Assets 菜单栏下的菜单

[MenuItem("Assets/菜单路径名")]
static void 方法名()
{
    
    
}

Inspector 组件右键菜单

组件右键菜单是使用特殊路径 CONTEXT 创建的

MenuCommand 可以获取到该组件

[MenuItem("CONTEXT/组件名/菜单名")]
static void 方法名(MenuCommand cmd)
{
    
    
    //组件名 t = cmd.context as 组件名;
    //对该组件进行操作
}

[MenuItem("CONTEXT/Transform/全部归0")]
static void ClearTransformMenu(MenuCommand cmd)
{
    
    
	Transform t = cmd.context as Transform;
	t.position = Vector3.zero;
	t.rotation = Quaternion.identity;
	t.localScale = Vector3.zero;
	GameObject obj = new GameObject();
	obj.transform.parent = t.gameObject.transform;
}

问题:

菜单检查 在 Hierarchy 右键菜单里面,检查没有效果,但是在顶上菜单和 Project 右侧里面可以用。

二、AddComponentMenu 特性

AddComponentMenu 直接加载类上,会自动将菜单加到 Component 下,并加在 Inspector 面板的 AddComponentMenu 里

AddComponentMenu(string menuName, int order)
menuName:菜单名路径
order:菜单项排序
[AddComponentMenu("自定义/UILable",1)]
public class UILable : MonoBehaviour
{
    
    
}

三、ContextMenu 特性 添加组件右键菜单

和 [MenuItem(“CONTEXT/组件名/菜单名”)] 功能几乎一样

ContextMenu(string itemName, bool isValidateFunction, int priority)
itemName:菜单名称
isValidateFunction:不写为falsetrue则点击菜单前就会调用 
priority:菜单项显示排序 默认 1000000
class 组件类名:MonoBehaviour
{
    
    
    [ContextMenu("菜单名称")]
	public void 方法名()
	{
    
    
        //执行内容
	}
}

public class UILable : MonoBehaviour
{
    
    
	[ContextMenu("菜单名称")]
	public void SetAddObj()
	{
    
    
		transform.position = Vector3.zero;
		transform.rotation = Quaternion.identity;
		transform.localScale = Vector3.zero;
		GameObject obj = new GameObject();
		obj.transform.parent = transform;
	}
}

四、其他

1.清空 Unity Dubeg

static void ClearDebug()
{
    
    
	Assembly assembly = Assembly.GetAssembly(typeof(SceneView));
	Type logEntries = assembly.GetType("UnityEditor.LogEntries");
	MethodInfo clearConsoleMethod = logEntries.GetMethod("Clear");
	clearConsoleMethod.Invoke(new object(), null);
}

猜你喜欢

转载自blog.csdn.net/weixin_42235716/article/details/124494844