Unity 備忘録テクニック(Unity エディタのメニュー)




あけましておめでとうございます。
プロクラスの野間です。

今回はUnityのちょっとしたテクニックを数回に分けてご紹介します。
(実は後先考えていない見切り発車だったりしますが・・・)
初心者向けではなく中級者以上が対象となるようなものです。
中級者以上と書きましたが、難しいから中級者以上なのではなく、必要/不要の意味で結構ガリガリとUnityを使わないと必要としないようなものです。

知っていると何となくガリガリ使っちゃいそうですが・・・

第一回となる今回はメニューの作り方です。

UIでメニューを作るとかじゃないですよ?

UnityEditor の本物のメニューカスタマイズです。

normalmenu

■スクリプトで色々作りたい
Unity はスクリプトだけでかなりのことが出来ます。
スクリプトで GameObject を作りたいって思ったことは無いですか?
『それぐらい知ってる、new GameObject() で作れる』
はい、そうですね。
ところでそれ、実行を停止した後も残っていますか?

通常の作り方をした場合、実行してから GameObject を作成し、停止したら消えてしまいませんか?
『え?そりゃ消えちゃうけど、残す必要ある?』
はい、色々やっていると出来たらいいなぁって事があるんです。

まぁ、それはさておき、最初にお伝えしたとおり、何回かに分けてスクリプトで色々作ってみたいと思います。

■メニューのカスタマイズ
世にある数々のエディター達。
これらの殆どはメニューを持っています。そして、メニューをカスタマイズ出来る物も多いでしょう。
ただ、これらのメニューをカスタマイズするには「別途」プログラムを組む必要があるものが殆どでしょう。

Unityも例外ではありません。
メニューを持ち、そして、カスタマイズ出来るのですが、Unity はプログラムが組めます。
しかも、めっちゃ手軽に組めます。で、そのままメニューがカスタマイズできたりします・・・

『GameObject を残すのとメニューに何の関係が?』

あるんです。
メニューから実行したプログラムで作成した GameObject は消えずに残ります。
まぁ、単純に考えて、再生ボタンを押下してないんだから再生停止なんて出来ませんから、残ったままになるのもうなずけます(?)。

てな訳で・・・

■メニューの作りかた
さて、本題です。

Unity ではすごく簡単にメニューが作れます。
まずは Script を作ります。
もちろん名前は何でもOK!
GameObject に関連付いている必要もありません!
何か広告のキャッチコピーみたいになってしまいましたね・・・

ここでは例として「MenuScript.cs」の名前で作ったとします。

(もちろん好きな名前でOK)
すると、自動で次のような Script が作成されます。

using UnityEngine;
using System.Collections;

public class MenuScript : MonoBehaviour {
	// Use this for initialization
	void Start () {

	}
	// Update is called once per frame
	void Update () {

	}
}

が・・・
自動で用意されたものはほとんど必要ではありません・・・
まずはこの行

public class MenuScript : MonoBehaviour {

MonoBehaviour は必要ないので削除します(「:」も削除)

public class MenuScript {

次に MenuScript の中身も全部不要なので削除です。
そうすると次のようになります。

using UnityEngine;
using System.Collections;

public class MenuScript {
}

ほぼ空になっちゃいましたね・・・

次は追加作業です。
まずは using UnityEditor; を追加です。

using UnityEditor;
using UnityEngine;
using System.Collections;

public class MenuScript {
}

これを書けば UnityEditor で使えるあれこれが簡単に使えるようになります。
そして、いよいよメニューです。

using UnityEditor;
using UnityEngine;
using System.Collections;

public class MenuScript {
	[MenuItem ("Custom/Menu")]
	static void MenuFunction () {
		Debug.Log ("Hoge");
	}
}

ここでも関数名「MenuFunction」は何でもOKです。
ポイントは
[MenuItem (“Custom/Menu”)]

static
です。

まずは[MenuItem (“Custom/Menu”)]の説明ですが、これは単にメニューに Custom/Menu を追加するだけです。

実際に Unity のメニューを見てみると・・・

beforemenu -> aftermenu

「Custom」が追加されており、そのメニューの中に「Menu」が出来ています。
つまり、ここを
[MenuItem (“YYY/EEEE/RRR“)]
とすると、これが
custom_menu
次のようになります
y_e_r
変わりましたね。

そして、次の static ですが、これは書くだけでOKです。
これの説明はインスタンスの理解が必要になるのですが、メニューから実行されるプログラムはインスタンス化するタイミングが無い(?)ので static である必要があります。
当然戻り値も無いので static void が定番になります。

てな訳で、いざ Unity で今作ったメニューを選択すると・・・

unity_menu_console

めでたく Console に Hoge と表示されました。

ちなみにですが、Console で「Clear on Play」が押下されていても再生ボタンを押下していないのですから、メニュー選択で実行してもDebug.Log は消えません。

これだけでメニューが出来ちゃいましたが、まだ次回に続きます。