その他
    ホーム 技術発信 DoRuby 【Unity】メニュー項目を増やして君だけの最強のUnityを作ろう!
    【Unity】メニュー項目を増やして君だけの最強のUnityを作ろう!
     

    【Unity】メニュー項目を増やして君だけの最強のUnityを作ろう!

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    MenuItem属性を使ってUnityのメニューをカスタマイズします。

    はじめに

    4月に入社し、配属先のプロジェクトのエンジニア業務を引き継いで早くも半年。
    今までUnityで当たり前のように使っていた機能が、実は先輩方が作った機能だと知り驚きました。
    Unityを使い始めたのも3月ぐらいなので、メニューに存在する項目は最初からあるものだと勘違いしていたのです。(無知)
    …というより業務に関係する機能が多かったので、家でUnityを触っていても無いことに気付かなかったと言うのが正解です。

    ということなので、今回はUnityのメニューに項目を追加して、便利なスクリプトをポチっと実行出来るようにしちゃおうという話です。

    メニュー項目を追加する方法

    さて、メニュー項目、つまりMenuItemの追加方法ですが、もちろんスクリプトで行います。
    静的関数の定義時に[MenuItem]属性を付けることで、その関数がMenuItem(つまりメニュー項目)として登録されます。

    [MenuItem("CustomMenu/MenuTest")]
    static void MenuTest(){
        // なんかする
        Debug.Log("なんかした!");
    }
    

    こんな感じですね。
    この場合、メニューの大項目に「CustomMenu」が追加され、その下に「MenuTest」という項目が追加されます。
    クリックすると、MenuTest関数に記述した処理を実行できます。

    enter image description here

    [MenuItem("Window/MyWindow")] のように、既に存在する大項目の下に新たな項目を追加することも可能です。

    ちょっと応用編

    チェックマークをつける

    Menu.SetChecked関数にメニュー項目のパスとtrue/falseを渡すことで、チェックマークが付けられます。
    デバッグする際に切り替えたいゲーム全体に関わるフラグなどをここで変更できると楽ですね。
    現在の状態を取得するのはMenu.GetChecked関数で行います。

    [MenuItem("CustomMenu/Check")]
    static void Check(){ 
        var path = "CustomMenu/Check";
        var checkFlag = Menu.GetChecked(path);   
        // 何らかのtrue/falseを切り替えたりする
        Menu.SetChecked(path, !checkFlag);
        Debug.Log("何らか is " + (!checkFlag).ToString() + "!");
    }
    

    ショートカットキーを設定する

    追加した項目に対してショートカットキーを設定します。
    MenuItemの引数に設定してるパスの最後に、「半角スペース」「修飾子キー」「文字」を入れることで設定できます。
    以下の例では、#がShift、%がcommand(WindowsではCtrl)を表すので、
    Shift + cmd + D で任意のスクリプトが実行可能になっています。

    [MenuItem("CustomMenu/ShortCutTest #%d")]
    static void ShortCutTest(){
        // なんかする
        Debug.Log("ShortCut!");
    }
    
    enter image description here

    コンテキストメニューに追加する

    右クリックや歯車マークのクリックなどで表示されるコンテキストメニューに、新たな項目を追加します。
    選択中のアセットやコンポーネント等を取得し、それに対して処理を行うことも可能になります。

    [MenuItem("CONTEXT/Component/ContextTest")]
    static void ContextTest(MenuCommand menuCommand){
        // コンポーネントに対してなんかする
        Debug.Log(menuCommand.context);  
    }
    

    コンテキストメニューに項目を追加するには、MenuItem属性の引数であるパスの一番最初に CONTEXT/ を入れます。
    上の例では、ComponentのコンテキストメニューにContextTestという項目を追加し、
    MenuCommand型の引数を設定することで、その引数を使って取得したコンポーネントの情報を表示しています。
    もちろん引数を取らなくてもメニュー項目を追加できます。
    また、コンテキストメニューに対しても先ほどの方法と同じやり方でショートカットキーの設定が出来ますが、コンテキストメニューを開いている状態でないと有効になりません。

    enter image description here

    実際の使用例

    私の所属しているプロジェクトでは、このMenuItem属性を使って、日々の作業を楽にしてくれるようなスクリプトをすぐに実行出来るようにしてあります。

    AssetBundleのビルド
    AssetBundleNameの設定
    Unityエディタ上でゲーム実行時、AssetBundleのロードを行うかどうかのフラグ
    選択したアセットを使っているプレハブやシーンを、GUIDをキーにして検索
    JSONファイルからプレハブを作成

    などなど、主にアセット管理の面で役に立つものが多いですね。先人に感謝。

    さいごに

    メニュー項目やコンテキストメニューの項目をカスタマイズすることで、自分のプロジェクトに適したUnityが構築できますね。

    メニュー項目を増やして君だけの最強のUnityを作ろう!(タイトル回収)

    記事を共有