メニューバーとは?
Windowsの場合、UnityEditorの上部に表示されるメニューです。
MacOSの場合、UnityEditorにフォーカスがある時に画面の上部に表示されます。
スクリプトを書くことで、このメニューの中に任意のメニューを追加することが出来ます。
メニューを追加するまで
プロジェクト内のAssets以下に、Editorフォルダを作成します。
どこにあってもいいのですが、スクリプトを配置しているフォルダ内とかに作ることが多いです。
Editorフォルダ内のスクリプトはUnityEditor上でしか使用できません。
ビルドした後のアプリケーションには含まれないので注意が必要です。
Editorフォルダを用意したら以下の様なスクリプトを用意します。
ファイル名は、MyMenu.csとしておきます。
using UnityEditor;
using UnityEngine;
public static class MyMenu
{
[MenuItem("MyMenu/Item1")]
private static void Item1()
{
Debug.Log("Item1");
}
}
これで、メニュー内にMyMenu→Item1という項目が増えており、
クリックするとログが表示されると思います。
(撮影の都合上縦長になっていますが、実際には横長です)
スクリプトを見てもらえると分かるように、/
(スラッシュ)で区切ることでメニューを階層化できます。
メニューアイテムを無効化する
UnityEditorのメニューの中にグレーになっていて押せない項目が時々あります。
自分用の追加した項目でも同様の押せない状態にすることが出来ます。
スクリプトを以下の様にしてみます。
using UnityEditor;
using UnityEngine;
public static class MyMenu
{
private const string MenuItem1 = "MyMenu/Item1";
[MenuItem(MenuItem1)]
private static void Item1()
{
Debug.Log("Item1");
}
[MenuItem(MenuItem1, true)]
private static bool Item1Validate()
{
return false;
}
}
これでItem1がグレーになり選択できなくなりました。
MenuItem
属性に共通の文字列を渡すため、constで定義しています。
MenuItem
の第二引数にtrueを渡すことで、次のメソッドはバリデーション用になり、
戻り値にbool
型を返すようにする必要があります。
この時false
を返すとその項目は無効になります。
メソッドの名前はなんでもいいです。
今回は固定でfalse
を返していますが、
バリデーション用メソッドの中で、
- 特定のアセットを選択している
- 特定のフォルダがある
などで判断して戻り値を変更してやれば、動的に変更することも出来ます。
メニューにチェックを入れる
メニューの項目にチェックマークをつけることも出来ます。
複数の項目からどれかを選択するようなメニューの場合、
現在どれを選択しているのか分かるようにするとよいかもしれません。
using UnityEditor;
public static class MyMenu
{
private const string MenuItem1 = "MyMenu/Item1";
[MenuItem(MenuItem1)]
private static void Item1()
{
bool check = Menu.GetChecked(MenuItem1);
Menu.SetChecked(MenuItem1, !check);
}
[MenuItem(MenuItem1, true)]
private static bool Item1Validate()
{
return true;
}
}
Menu.GetChecked
にメニューのパスを渡すとその項目にチェックが入っているかどうか取得できます。
Menu.SetChecked
にbool型を渡すとその項目のチェック状態を変更できます。
今回は反転させているので、項目を選択すると後にチェック状態が入れ替わります。
UnityEditor
を閉じてもチェック状態を維持したい場合は、PlayerPrefs
やEditorPrefs
上に状態を保存しておき、
バリデーション用メソッド内などからチェック状態を復元してやるといいと思います。
HIerarchyのメニューに追加する
HIerarchy
上で右クリックした時に出るメニューですが、下部のCreate Empty
以降は、
メニューバーのGameObject
メニューとほぼ同じ内容のものが表示されています。
そのため、[MenuItem(”GameObject/MeyMenuItem)]
とすることで、
GameObject
メニューとヒエラルキー上の右クリックメニューの両方に項目を追加することが出来ます。
Projectのメニューに追加する
Project
上で右クリックした時に出るメニューですが、
メニューバーのAssets
メニューと同じ内容が表示されています。
そのため、[MenuItem(”Assets/MeyMenuItem)]
とすることで、
Assets
メニューとProject
上の右クリックメニューの両方に項目を追加することが出来ます。
メニューは追加できる
メニューの中に独自の項目を簡単に追加できるのが分かったとか思います。
メニューをうまく使えば、
- 特定のシーンを開く
- GameObjectをまとめて生成する
- 必要なウィンドウをまとめて開く
などいろいろ楽が出来る場合があると思うので積極的に活用しましょう。