1. 程式人生 > >Unity編輯器擴充套件-選單項

Unity編輯器擴充套件-選單項

Unity編輯器允許你去新增像內建選單一樣外觀和行為的自定義選單。自定義選單對於那些經常使用的功能提供一種能從編輯器直接訪問的便捷方式。在這一課程中我將對每個描述的主題提供真實的使用示例,用於說明在unity中的選單項是如何建立和使用的。

新增選單項

為了要在頂層工具欄中建立一個新的選單項,你必須去建立一個編輯器指令碼(在專案Editor目錄下的一個指令碼)。此選單項需要是一個靜態的方法且必須使用MenuItem屬性來標識。例如,去新增一個你的團隊和公司經常使用的命令到“Tools”選單。 
下面的示例,在Tools選單下添加了一個“Clear PlayerPrefs”選項:

using
UnityEngine; using UnityEditor; public class MenuItems { [MenuItem("Tools/ClearPlayerPrefs")] private static void NewMenuOption() { PlayerPrefs.DeleteAll(); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

這段程式碼建立了一個叫“Tools”的選單,並在下面放置了一個叫“Clear PlayerPrefs”的選單項。 
這裡寫圖片描述 
當然我們也可以在一個現成的選單項下面建立新的選單項(例如:在“Windows”選單下),也可以建立多級子選單便於更好的組織選單專案:

using UnityEngine;
using UnityEditor;

public class MenuItemsExample
{
    // Add a new menu item under an existing menu

    [MenuItem("Window/New Option")]
    private static void NewMenuOption()
    {
    }

    // Add a menu item with multiple levels of nesting

    [MenuItem("Tools/SubMenu/Option")]
    private
static void NewNestedOption() { } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

上面的程式碼產生的結果如下: 
這裡寫圖片描述

快捷鍵

為了使超級使用者和喜歡使用鍵盤的使用者工作的更快捷,我們可以為新的選單項關聯一個快捷鍵-使用快捷鍵的組合將自動的啟動他們選單項。 
下面是被指定的鍵(它們也可以組合起來使用):

  • %-CTRL 在Windows / CMD在OSX
  • # -Shift
  • & -Alt
  • LEFT/RIGHT/UP/DOWN-游標鍵
  • F1…F12
  • HOME,END,PGUP,PDDN

字母鍵不是key-sequence的一部分,要讓字母鍵被新增到key-sequence中必須在前面加上下劃線(例如:_g對應於快捷鍵”G”)。 
快捷鍵的組合被新增在選單項的路徑後面,並以一個空格分隔。如下顯示的示例:

// Add a new menu item with hotkey CTRL-SHIFT-A

[MenuItem("Tools/New Option %#a")]
private static void NewMenuOption()
{
}

// Add a new menu item with hotkey CTRL-G

[MenuItem("Tools/Item %g")]
private static void NewNestedOption()
{
}

// Add a new menu item with hotkey G
[MenuItem("Tools/Item2 _g")]
private static void NewOptionWithHotkey()
{
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

使用了快捷鍵的選單項將顯示用於啟動它們的快捷鍵,示例如下: 
這裡寫圖片描述 
注意:這裡沒有驗證重複的快捷鍵,如果定義了多個相同的快捷鍵,那麼也只有一個選單項被呼叫。

特殊路徑

顯示,傳遞到MenuItem屬性上的路徑確定了新的選單項將被放置在哪個頂層選單下。Unity有些特殊的路徑作用於上下文選單(通過右鍵訪問的選單):

  • Assets -選單項將被顯示在“Assets”選單下,同時也顯示在右鍵單擊專案檢視時彈出的選單中。
  • Asset/Create - 選單項將被列出在,當你在專案檢視中單了右鍵選單裡的“Create”子選單中(當你建立了能夠新增專案的新型別時,此功能是是非常有用的)。
  • CONTEXT/ComponentName - 選單項將出現在給定元件的上下文選單(右鍵單擊顯示的選單)中。

下面顯示了一些如何使用特殊路徑的示例:

// Add a new menu item that is accessed by right-clicking on an asset in the project view

[MenuItem("Assets/Load Additive Scene")]
private static void LoadAdditiveScene()
{
    var selected = Selection.activeObject;
    EditorApplication.OpenSceneAdditive(AssetDatabase.GetAssetPath(selected));
}

// Adding a new menu item under Assets/Create

[MenuItem("Assets/Create/Add Configuration")]
private static void AddConfig()
{
    // Create and add a new ScriptableObject for storing configuration
}

// Add a new menu item that is accessed by right-clicking inside the RigidBody component

[MenuItem("CONTEXT/Rigidbody/New Option")]
private static void NewOpenForRigidBody()
{
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

上面程式碼片段產生的結果如下圖:

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

有效性驗證

有些選單項僅在指定的情況下才可用,否則就應該被禁用。根據它的上下文新增一個驗證方法來啟用/禁用一個選單項。 
驗證方法是一個靜態的,並使用MenuItem屬性標記的一個方法,且此屬性傳遞true作為一個驗證引數。 
這個驗證方法應該和選單的命令方法有相同的路徑,並且要有一個boolean的返回值,用以確認選單是否被啟用或者禁用。 
例如,驗證方法能夠被用於在專案視圖裡一個紋理上的右鍵選單:

[MenuItem("Assets/ProcessTexture")]
private static void DoSomethingWithTexture()
{
}

// Note that we pass the same path, and also pass "true" to the second argument.
[MenuItem("Assets/ProcessTexture", true)]
private static bool NewMenuOptionValidation()
{
    // This returns true when the selected object is a Texture2D (the menu item will be disabled otherwise).
    return Selection.activeObject.GetType() == typeof(Texture2D);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

當在非任意紋理上單擊右鍵時,此選單項將會被顯示成灰色: 
這裡寫圖片描述

控制選單的優先順序

優先順序是個被賦值到選單項一個數字(傳遞給MenuItemde的第3個引數),它控制了選單的顯示順序。 
選單項也能夠自動的分組,每50個一個組:

[MenuItem("NewMenu/Option1", false, 1)]
private static void NewMenuOption()
{
}

[MenuItem("NewMenu/Option2", false, 2)]
private static void NewMenuOption2()
{
}

[MenuItem("NewMenu/Option3", false, 3)]
private static void NewMenuOption3()
{
}

[MenuItem("NewMenu/Option4", false, 51)]
private static void NewMenuOption4()
{
}

[MenuItem("NewMenu/Option5", false, 52)]
private static void NewMenuOption5()
{
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

上面的程式碼示例顯示如下的結構,選單項被分為了兩個組:

這裡寫圖片描述

其他相關的類

下面列出了對於新增選單項一些相關的類。

當新增一個新的選單項到Inspector中(使用 “CONTEXT/Component”),有時候獲取一個真實元件的引用也是有必要的(例如:修改它的資料)。 
這可以通過給新選單項的靜態方法新增一個MenuCommand引數。

[MenuItem("CONTEXT/RigidBody/New Option")]
private static void NewMenuOption(MenuCommand menuCommand)
{
    // The RigidBody component can be extracted from the menu command using the context field.
    var rigid = menuCommand.context as RigidBody;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

ContextMenu

這個屬性允許你去定義上下文選單。它和使用MenuItem並以“CONTEXT/…”作為路徑定義選單項一樣。 
這個屬性不同的是,你能給指定的元件定義預設的上下文選單項,然而使用MeneItem只是為了擴充套件現有的元件選單,比如引擎預設的元件。 
示例-元件將顯示一個用於清除資料的選單項:

public class NameBehaviour : MonoBehaviour
{
    public string Name;

    [ContextMenu("Reset Name")]
    private static void ResetName()
    {
        Name = string.Empty;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

ContextMenuItem

這個屬性被新增到元件類的欄位上,上面顯示了ContextMenu屬性在元件上下文選單中添加了一個選單項,然後ContextMenuItem屬性將在欄位的上下文選單中新增一個選單項。 
由於這個屬性被新增到了一個欄位上沒有方法,所有它接受兩個引數:一個用於顯示選單項的名字,一個用於指定一個當選單被選中時要呼叫的例項方法。 
例項-新增一個隨機初始化欄位的方法:

public class NameBehaviour : MonoBehaviour
{
    [ContextMenuItem("Randomize Name", "Randomize")]
    public string Name;

    private void Randomize()
    {
        Name = "Some Random Name";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

上面程式碼的結果顯示了當在欄位上單擊右鍵時彈出的選單項:

這裡寫圖片描述

AddComponentMenu

此屬性允許你去放置指令碼到“Component”選單下的任意位置,而不只是在“Component->Scripts”選單下。你能使用它去更好的組織你的指令碼。這個屬效能夠改善新增指令碼的工作流程。重要提示:你需要重啟才生效。

using UnityEngine;

[AddComponentMenu("Transform/Follow Transform")]
public class FollowTransform : MonoBehaviour
{
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

GenericMenu

GenericMenu讓你可以建立一個自定義的上下文選單和下拉選單,下面這個示例開啟一個帶有綠色區域的視窗,在綠色區域上單擊右鍵將顯示一個選單,當觸發了選單中選中的項時將觸發一個回撥。

using UnityEngine;
using UnityEditor;
using System.Collections;

// This example shows how to create a context menu inside a custom EditorWindow.
// context-click the green area to show the menu

public class GenericMenuExample : EditorWindow
{

    [MenuItem("Example/Open Window")]
    static void Init()
    {
        var window = GetWindow<GenericMenuExample>();
        window.position = new Rect(50, 50, 250, 60);
        window.Show();
    }

    void Callback(object obj)
    {
        Debug.Log("Selected: " + obj);
    }

    void OnGUI()
    {
        Event currentEvent = Event.current;
        Rect contextRect = new Rect(10, 10, 100, 100);
        EditorGUI.DrawRect(contextRect, Color.green);

        if (currentEvent.type == EventType.ContextClick)
        {
            Vector2 mousePos = currentEvent.mousePosition;
            if (contextRect.Contains(mousePos))
            {
                // Now create the menu, add items and show it
                GenericMenu menu = new GenericMenu();
                menu.AddItem(new GUIContent("MenuItem1"), false, Callback, "item 1");
                menu.AddItem(new GUIContent("MenuItem2"), false, Callback, "item 2");
                menu.AddSeparator("");
                menu.AddItem(new GUIContent("SubMenu/MenuItem3"), false, Callback, "item 3");
                menu.ShowAsContext();
                currentEvent.Use();
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

總結

這篇文章說展示的,在Unity編輯器中去擴充套件一個選單項是非常簡單的。 
在編輯器中為常用功能建立選單項。可以為規範團隊開發並且能夠節約很多時間。

原文地址

相關推薦

Unity編輯擴充套件-單項

Unity編輯器允許你去新增像內建選單一樣外觀和行為的自定義選單。自定義選單對於那些經常使用的功能提供一種能從編輯器直接訪問的便捷方式。在這一課程中我將對每個描述的主題提供真實的使用示例,用於說明在unity中的選單項是如何建立和使用的。 新增選單項 為了要在頂層工具

Unity 編輯擴充套件總結 一:編輯開發入門

編輯器擴充套件總結 工欲善其事必先利其器 引言: 在專案開發中,編輯器擴充套件為開發者提供了開發自定義工具的功能,讓開發者更加便利地使用編輯器開發專案。近期小生一直在學習編輯器擴充套件的知識,發現網路上關於編輯器知識點的部落格較為零散且混亂。當然,有一些大佬已經總結的很

unity編輯擴充套件#2 GUILayout、EditorGUILayout 控制元件整理

  GUILayout 裝飾類控制元件: GUILayout.FlexibleSpace(); GUILayout.Space(100);//空格,沒什麼好說的 GUILayout.Label("label"); GUILayout.Box(new GUICo

unity編輯擴充套件#1 自定義視窗、面板、和屬性

擼一遍unity官方文件的給的三個案例:https://docs.unity3d.com/2017.4/Documentation/Manual/editor-EditorWindows.html 自定義視窗 首先,要注意和編輯器相關的指令碼都應該把放到Editor資料夾裡,可以有多個E

Unity編輯擴充套件:如何把asset 格式的資源轉成png

Assets Store 上提供了大量的優秀素材給開發者使用,包括模型貼圖UI音樂等等。但是一些上傳者可能出於特殊原因,上傳的素材格式是unity內建的.asset 格式,這樣的格式對於直接拿來在unity中使用的開發者當然沒有影響,但是遇到素材本身不是完全符合需求,需要做一些修

Unity編輯擴充套件:如何把圖集(Atlas)拆分成單個圖片

遊戲開發中可能會用到商店下載的圖集,但是如果只是用到一部分,卻把整個圖集打包到專案則明顯是不划算的。可以讓美術同事單獨把需要的圖片切出來,但是圖源比較多的話也是一個不小的工作。既然能夠拿到切好的圖集資料,是不是可以通過程式碼自動生成切好的小圖呢,答案當然是肯定的。這裡提供一個小工具,操作

Unity編輯擴充套件

(我們自己寫的指令碼放在 Editor檔案裡(Editor 自己建立 跟建立Scenes檔案一樣))1 增加簡單選單欄(第一排選單欄)(我們使用靜態方法便於呼叫     不用靜態方法   我們Unity不能顯示出來)public Class  Tools  {   [Menu

unity編輯 擴充套件之 快捷鍵寫法與意義

 using UnityEngine; using System.Collections; // using UnityEditor;<span style="white-space:pre"&

Unity編輯擴充套件學習筆記(一)——新增選單選項

以前一直沒用到編輯器擴充套件這一塊,上一次用還是當初在培訓機構老師教編寫打包工具的時候,那時候剛接觸unity聽不大懂也不知道幹啥用。轉眼就過去了好久。 最近遇到一些情況,有時候需要修改多個GameObject身上的屬性,有時候需要按照規律建立多個GameObject,這些

Unity 編輯擴充套件 場景檢視內控制物件

using UnityEngine;using UnityEditor; [CustomEditor(typeof(EnemySpawn))]public class EnemySpawnEditor : Editor {     void OnSceneGUI()     {         EnemySp

Unity 編輯擴充套件

 Unity編輯器擴充套件 1 在工程目錄下新建 Editor 資料夾 Editor資料夾內的資源都不會被打包出去(包括PC 移動端等 只會在unity的編輯器模式執行)   //正常的新增選單欄     [MenuItem("Tools/test")]  

Unity 編輯擴充套件,讓開發更加快捷

      在unity開發中經常會對資源或者指令碼進行批量處理,開發自己的工具可以加快處理的速度。當然有的地方必須要用到編輯器類,例如資源打包的時候需要觸發,這時候就用到了。 1.MeuItam函式的使用,如下;當編輯器沒有你自定義的根選項時編輯器會新建一個選項,例如Too

Unity 編輯擴充套件教程

來自:candycat1992 http://blog.csdn.net/candycat1992/article/details/52067975 寫在前面 Unity最強大的地方之一是它擴充套件性非常強的編輯器。Unite Europe 20

Unity編輯擴充套件簡介】儲存資料

unity編輯器中有三種方式可以儲存資料。 EditorPrefs EditorPrefs可以在PC中儲存共享資料,即不受制於專案地儲存資訊 影響範圍 儲存的值會影響每一個大版本的Unity編輯器 以前儲存在Unity4.x的值只能在Unity 4

Unity編輯擴充套件(音效控制面板,路徑增刪)

using UnityEngine;using UnityEditor;using System.Collections.Generic;using System.Text;using System.IO;public class MusicWindowEditor : Ed

unity-編輯擴充套件

unity編輯器擴充套件很方便,可以省掉很多製作其他工具的時間(比如技能編輯器,特效編輯器等,都是資料結構的匯入匯出) 可以直接在 Scene 、Inspector 或者新建一個 Window 中編輯 1、Inspector

Unity - 編輯擴充套件

# 前言 對於Unity編輯器的擴充套件方法眾多,本文從最常用的一些方法入手,例如Inspector指令碼欄的擴充套件、頂選單欄的擴充套件等,圖文並茂闡述其完整用法。 本文大部分內容整理自 [獨立遊戲開發 - indienova](https://indienova.com/u/dev) 所著的 **Uni

unity編輯擴充套件學習

擴充套件編輯器實際上就是在unity選單欄中新增一些按鈕,可以一鍵執行一些重複性的工作。 一.新增按鈕 1.簡單使用MenuItem特性 using UnityEngine; using UnityEditor; public class Tools { [MenuItem("Tools/test

Unity 3D編輯擴充套件介紹、教程(一) —— 建立單項

Unity編輯器擴充套件教程 本文提供全流程,中文翻譯。Chinar堅持將簡單的生活方式,帶給世人!(擁有更好的閱讀體驗 —— 高解析度使用者請根據需求調整網頁縮放比例)

unity 編輯 ---獲取unity編輯中的所有視窗,並開啟顯示,以備後面編輯擴充套件

獲取原理:unity 所有視窗介面都繼承自編輯器UnityEditor程式集下的EditorWindow。而所有的編輯器視窗都在UnityEditor程式集裡定義,所以,我們通過反射獲取UnityEditor程式集獲取所有視窗就可以了。 直接上程式碼: using System; using