Unity编译器拓展学习总结(二):各个平台菜单栏拓展
前情参考:Unity编译器拓展学习总结(一):常用工具API
文章目录
前言
上篇文章我们介绍了编译器拓展的工具API,这篇文章根据编译器拓展插件的具体位置介绍编译器拓展。
菜单栏拓展
使用MenuItem特性进行拓展,可以设置不同的属性,可以通过这个特性加在任何位置的菜单栏。
1、MenuItem的写法
using UnityEditor;
using UnityEngine;
public class MenuItemTest
{
//第一个参数表示在菜单栏的Menu的路径,点击将会执行这个方法
[MenuItem("Tools/test/Test1")]
static void MenuTest1()
{
Debug.Log("Test1");
}
#region MenuItem的验证方法加入
//第一个参数表示是否为验证方法,为true时,当返回值为true时,菜单中的按钮才可进行操作,注意:需要有一个非验证方法才能起作用,即
//第二个参数为false,且其他参数必须保持一致
[MenuItem("GameObject/my delete",true,11)]
static bool MyDeleteValidate()
{
return Selection.gameObjects.Length > 0;
}
[MenuItem("GameObject/my delete",false, 11)]
static void MyDelete()
{
foreach (var o in Selection.objects)
{
//GameObject.DestroyImmediate(o);
Undo.DestroyObjectImmediate(o);//利用Undo进行的删除操作是可以撤销的
}
//需要把删除操作注册到操作记录中
}
#endregion
#region 优先级
//第三个参数为优先级
//每一个菜单栏的priority优先级默认1000,与上一个最大的按钮优先级相差大于等于11会分到另外一组
[MenuItem("Tools/test/Test1",false,1)]
static void Test1()
{
Debug.Log("Test1");
}
//一些快捷键的加入:%表示Ctrl键,#表示Shift键,&表示Alt
//小写字母则是表示26个字母键盘,注意:控制按键不能单独存在,小写字母也不能单独存在,控制键需要写在前面,注意快捷键冲突
[MenuItem("Tools/test/Test2 _#q", false,2)]
static void Test2()
{
Debug.Log("Test2");
}
//会被分到新的一组
[MenuItem("Tools/test/Test3 _u", false,13)]
static void Test3()
{
Debug.Log("Test3");
}
#endregion
}
2、Hierarchy面板菜单拓展
//path里面的路径,根路径必须是GameObject
//一般优先级设为0,可以调整,但不能设的太大,不然会分到另外一组,会导致无法在Hirerarchy显示,只能在菜单栏显示
[MenuItem("GameObject/My Method", false, 0)]
static void MyDeleteValidate()
{
Debug.Log("MyMethod");
}
3、Assets面板菜单拓展
//path里面的路径,根路径必须是Assets
//在Assets/Create/New Weapon目录下新建一个按钮,点击就执行下面的方法
[MenuItem("Assets/Create/New Weapon")]
public static void Creat()
{
Debug.Log("Creat");
}
只适用于ScriptableObject的Assets面板菜单拓展
//fileName参数为点击后生成的文件名,menuName参数为相对与Assets/Create菜单的相对路径,不设置将默认以类名设置,order为相对优先级
[CreateAssetMenu(fileName = "Data1", menuName = "ScriptableObjects/SpawnManagerScriptableObject2", order = 2)]
public class SpawnManagerScriptableObject2 : ScriptableObject
{
public string prefabName;
public int numberOfPrefabsToCreate;
public Vector3[] spawnPoints;
}
4、游戏物体Inspect面板菜单拓展
4.1、组件添加菜单拓展
//path里面的路径,根路径必须是Component,一般是用于添加组件
[MenuItem("Component/Add Test/Hello", false, 0)]
static void AddComponetToGameObject()
{
Debug.Log("AddComponetToGameObject");
}
4.2、组件菜单拓展
//按照CONTEXT/组件名/按钮名的顺序进行书写,根路径必须是CONTEXT,如下点击该组件右上角三点时将会有Clear按钮
//MenuCommand是当前正在操作的菜单命令正文
[MenuItem("CONTEXT/Rigidbody/Clear")]
static void ClearMassAndGravity(MenuCommand cmd)
{
//可以获取当前菜单命令正文的context字段获取当前正在操作的组件,接着就可以进行操作该组件了
Rigidbody rgd=cmd.context as Rigidbody;
rgd.mass = 0;
rgd.useGravity = false;
}
4.3、组件内部字段菜单拓展
使用ContextMenuItemAttrible特性进行拓展字段
public class PlayerHealth : MonoBehaviour
{
//第一个参数为按钮名,第二个参数为方法名,需要是无参无返回的方法签名
//在Inspector面板右击该字段会显示该按钮
[ContextMenuItem("Add HP", "AddHP")]
public int startingHealth = 100;
void AddHP()
{
startingHealth += 20;
}
}
总结
本篇文章介绍了各个显示窗口的菜单栏的拓展相关知识,通过对菜单栏进行拓展,可以增加各个各样的编译器按钮选项,出现不同的功能需求。