栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

Unity 编辑器扩展菜单

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Unity 编辑器扩展菜单

Unity 编辑器扩展菜单

目录
  • Unity 编辑器扩展菜单
    • 一、MenuItem 特性 菜单栏扩展
      • 1.创建多级菜单
      • 2.创建可使用快捷键的菜单项
      • 3.创建可被勾选的菜单项
      • 4.检查菜单是否使用
      • 5.菜单排序
      • 6.右键菜单扩展
        • Hierarchy 右键菜单
        • Project 右键菜单
        • Inspector 组件右键菜单
      • 问题:
    • 二、AddComponentMenu 特性
    • 三、ContextMenu 特性 添加组件右键菜单
    • 四、其他

一、MenuItem 特性 菜单栏扩展
MenuItem(string itemName, bool isValidateFunction, int priority) 
itemName:菜单名称路径 
isValidateFunction:不写为false,true则点击菜单前就会调用 
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:不写为false,true则点击菜单前就会调用 
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);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/901481.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号