官方也有一個文章,舉了 MenuItem
類的一些使用方法,傳送門:
http://unity3d.com/cn/learn/tutorials/modules/intermediate/editor/menu-items
首先是unity頂部菜單欄的一些用法,如圖:
注意:
MenuItem
是編輯器類,所以技能導入using UnityEditor;
命名空間,且一般我們的類也不是集成自MonoBehaviour
的,而是集成ScriptableObject
的。
最普通的MenuItem
調用:
[MenuItem("MenuItem/普通的頂部菜單")]
private static void MenuItemNormal()
{
Debug.Log("普通的頂部菜單");
}
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
需要注意的就是 unity 的頂部菜單的父一級,是不支持中文的,就是MenuItem
那一級,它的子級就沒關係了。
MenuItem菜單的先後排序:
[MenuItem("MenuItem/MenuItem2", false, 2)]
private static void MenuItemFunc2()
{
Debug.Log("MenuItemFunc2");
}
[MenuItem("MenuItem/MenuItem1", false, 1)]
private static void MenuItemFunc1()
{
Debug.Log("MenuItemFunc1");
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如圖中所示,雖然我們在寫代碼的時候是 item2 在前,但是我們在設置順序時給它設的是2,所以最後顯示的時候,則是1在前,2在後
MenuItem與快捷鍵進行關聯:
[MenuItem("MenuItem/快捷鍵1 _%#&_HOME")]
private static void MenuItemFunc3()
{
Debug.Log("MenuItemFunc3");
}
[MenuItem("MenuItem/快捷鍵2 _%#&_LEFT")]
private static void MenuItemFunc4()
{
Debug.Log("MenuItemFunc4");
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
入圖所示,這2個item選項跟快捷鍵關聯起來了,可以直接使用快捷鍵來調用。
規則是: % = ctrl
# = Shift
& = Alt
LEFT/RIGHT/UP/DOWN = 上下左右
F1…F2 = F...
HOME, END, PGUP, PGDN = 鍵盤上的特殊功能鍵
特別注意的是,如果是鍵盤上的普通按鍵,比如a~z
,則要寫成_a
~ _z
這種帶_前綴的。
選中的不是指定類型的對象,菜單項會被禁掉:
[MenuItem("MenuItem/Selected GameObject")]
private static void SelectedGameObject()
{
Debug.Log("SelectedGameObject");
}
[MenuItem("MenuItem/Selected GameObject", true)]
private static bool CheckObjectType()
{
Object selectedObject = Selection.activeObject;
if(selectedObject != null &&
selectedObject.GetType() == typeof(GameObject))
{
return true;
}
return false;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
這段的意思就是,如果你沒有選中任何遊戲對象,或者你選中的不是GameObject
類型的對象時,MenuItem/Selected
GameObject
選項會是被禁用的(灰色)狀態,只有選的是指定類型的選項時,纔是正常的可點擊狀態。
可以在 project 窗口裏右鍵到菜單:
如圖:
[MenuItem("Assets/在Project目錄裏右鍵1")]
private static void Assets_right_btn1()
{
Debug.Log("在Project目錄裏右鍵1");
}
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
我們只需要把選項設置在Assets
目錄的子上,就可以在Project
窗口裏右鍵出菜單了,當然也是可以有例如 Assets/Create/XXX
這樣的目錄存在。
在 Inspector 窗口中的指定控件身上右鍵到選項:
如圖:
[MenuItem("CONTEXT/Rigidbody/在Rigidbody上右鍵")]
private static void CONTEXT_Rigidbody_right_btn()
{
Debug.Log("在Rigidbody上右鍵");
}
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
有時候,我們想在某個控件上增加一些功能菜單,做一些比如自動給控件賦值等這種功能。
思路跟上面的其實是一樣的,只不過我們這次的父換成了CONTEXT
而已。
通過在 GameObject/UI 選項夾裏增加選項,使菜單在Hierarchy窗口中被右鍵到:
如圖:
[MenuItem("GameObject/UI/在GameObject目錄裏右鍵")]
private static void GameObject_right_btn()
{
Debug.Log("在GameObject目錄裏右鍵");
}
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
思路跟前面一樣,我們在 GameObject/UI/
目錄下增加了一個選項,我們發現不止在 Hierarchy 窗口中看到了它,在頂部菜單欄相同的層次下也看到了它。
但是這裏有個問題就是,我們並不能夠像 GameObject/XXX
這樣,把選項放在 UI
的外面,這樣做的話,我們只會在頂部欄的 GameObject
目錄下發現那個XXX
的選項,在
Hierarchy 什麼也不會有,這點需要大家注意。
補充:還有一種在Hierarchy
窗口設置菜單的方法,就是用編輯器的EditorUtility
類。
ContextMenu的使用十分的簡單,總共就只有2點
如圖:
注意:
ContextMenu
這個類創建的選項,都是基於當前它所在的集成自MonoBehaviour
的組件類的,不像MenuItem
幾乎是一個全局存在的選項
① 是我們在小齒輪點開的菜單上,增加一個選項
② 是我們爲testName
這個public
的變量單獨增加了一個右鍵選項
代碼:
using UnityEngine;
using System.Collections;
public class TestMain : MonoBehaviour
{
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
}
[ContextMenu("ContextMenu1")]
public void ContextMenuFunc1()
{
Debug.Log("ContextMenu1");
}
public int a = 0;
public string b = "";
[ContextMenuItem("add testName", "ContextMenuFunc2")]
public string testName = "";
private void ContextMenuFunc2()
{
testName = "testName";
}
}
- 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
- 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
代碼部分十分的簡單,不過有一點需要注意的地方,那就是第2個我們給變量testName
加菜單的時候,一定要把[ContextMenuItem]
寫在testName
上,而不是方法private
void ContextMenuFunc2()
上面,方法的調用靠在ContextMenuItem
上設置參數來完成。