Unity編輯器的擴(kuò)展,MenuItem的使用整理

本來是想學(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 {

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容