本來是想學(xué)習(xí)一下ScriptableObject的,看到例子上邊有CreateAssetMenu,就想到自己經(jīng)常搞忘MenuItem的用法,所以整理一下!
CreateAssetMenu主要是應(yīng)用在類上。添加CreateAssetMenu后,在Project面板中右鍵,默認(rèn)就會在Create菜單下,測試了一下,這個(gè)屬性是創(chuàng)建.asset文件用的,如果類繼承MonoBehaviour或者不繼承是不會出現(xiàn)這個(gè)菜單的!
[CreateAssetMenu(menuName = "CreateScriptableObject")]
public class CreateScriptableObject : ScriptableObject
{
public int variable;
}
接下來就開始整理MenuItem吧,MenuItem主要是應(yīng)用在方法上。
1.工具欄添加菜單
// 在Unity的頂部工具欄上添加一個(gè)菜單,這個(gè)比較簡單
[MenuItem("工具欄上的菜單/我的菜單")]
private static void AddBarMenu()
{
Debug.Log("添加了一個(gè)工具欄上的菜單");
}
2.Hierarchy面板或工具欄GameObject下添加菜單
//在Hierarchy面板右鍵或工具欄GameObject下添加一個(gè)菜單
[MenuItem("GameObject/Hierarchy面板上的菜單/物體各父物體層級的全路徑",false,10)]
static void PrintParent()
{
GameObject obj = Selection.activeGameObject;
if (obj == null)
{
//本來想像利用MenuItem的第二個(gè)參數(shù)設(shè)置禁用,但是沒有成功!反倒是當(dāng)選擇菜單的時(shí)候,兩個(gè)方法都執(zhí)行了!
Debug.Log("沒有選擇GameObject!");
return;
}
string path = "/" + obj.name;
while (obj.transform.parent != null)
{
obj = obj.transform.parent.gameObject;
path = "/" + obj.name + path;
}
Debug.Log(path);
}
這樣寫在頂部的工具欄GameObject下顯示沒有問題,但是在Hierarchy面板右鍵時(shí)有一些問題。最開始我直接這樣寫[MenuItem("GameObject/Hierarchy面板上的菜單/我的菜單")],右鍵的時(shí)候沒有出現(xiàn)菜單,后來我改成另一個(gè)重載[MenuItem("GameObject/Hierarchy面板上的菜單/我的菜單", false, 10)]之后,最后一個(gè)參數(shù)quantity權(quán)值從10 改到 1 都會顯示。我又改成這樣[MenuItem("GameObject/Hierarchy面板上的菜單/我的菜單")]后也會顯示!但是關(guān)了Unity重新啟動又不顯示了!我又將quantity權(quán)值添加上,從1 改到 10 都不會顯示,刷新也沒有用。
最后修改了菜單的名字,并且quantity權(quán)值為10。然后就沒有改動了,不知道這是為什么!
3.給菜單添加條件,設(shè)置是否啟用
// 如果沒有選擇Object,該項(xiàng)將是禁用的。
[MenuItem("工具欄上的菜單/打印選擇的Object的名字")]
static void SelectedObject()
{
Debug.Log("Selected Active Object is " + Selection.activeObject.name + ".");
}
// 驗(yàn)證有沒有選擇Object。
[MenuItem("工具欄上的菜單/打印選擇的Object的名字", true)]
static bool ValidateSelectedObject()
{
return Selection.activeObject != null;
}
4.Inspector面板給組件添加菜單
//添加一個(gè)Double Mass菜單選項(xiàng)到Rigidbody的上下文菜單(選擇Rigidbody組件右鍵彈出菜單)
[MenuItem("CONTEXT/Rigidbody/Double Mass")]
static void DoubleMass(MenuCommand command)
{
Rigidbody body = (Rigidbody)command.context;
body.mass = body.mass * 2;
Debug.Log("Doubled Rigidbody's Mass to " + body.mass + " from Context Menu.");
}
5.Project面板添加菜單
//在Project面板上的菜單
[MenuItem("Assets/Project面板上的菜單/我的菜單")]
private static void AssetMenu()
{
Debug.Log("MenuItemFunc1");
}
6.菜單排序
//添加菜單的先后排序
[MenuItem("工具欄上的菜單/我的菜單1", false, 2)]
private static void MenuItemFunc()
{
Debug.Log("MenuItemFunc");
}
7.添加組件菜單
AddComponentMenu是應(yīng)用在類上的。添加AddComponentMenu后,點(diǎn)擊Inspector面板的Add Component按鈕或者工具欄上的Component可以選擇添加增加的Component菜單,注意類名必須跟文件名相同才能顯示!
[AddComponentMenu("組件菜單/ComponentMenu")]
public class ComponentMenuTest : MonoBehaviour {
}