はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】エディタ拡張でメニューバーにチェックを付ける(Menu.SetChecked)

はじめに

今回はエディタ拡張でメニューバーにチェックを付ける方法について紹介したいと思います。

Menu.SetCheckedの利用例

docs.unity.cn
docs.unity3d.com

やり方

Menu.SetCheckedメソッドを利用することで、MenuItemのチェックマーク状態を設定できます。

public static void SetChecked(string menuPath, bool isChecked);
public static class MenuTest
{
    private const string MenuPath = "Tools/MenuSet";
    private static bool _isChecked;

    [MenuItem(MenuPath)]
    private static void Execute()
    {
        _isChecked = !_isChecked;
        Menu.SetChecked(MenuPath, _isChecked);
    }
}
Menu.SetCheckedの利用例

またMenu.GetCheckedメソッドを利用することで、MenuItemのチェックマーク状態を取得できます。

public static bool GetChecked (string menuPath);

エディタ起動時に前回の情報を読み込む

Menu.SetCheckedで記録したデータはメモリに格納されているため、エディタを閉じたらリセットされてしまいます。

前回の設定を引き継ぎたい場合はコードを追加します。

[InitializeOnLoad]
public static class MenuTest
{
    private class StartUpData : ScriptableSingleton<StartUpData>
    {
        private int _count;

        public bool IsStartUp()
            => _count++ == 0;
    }
    
    private const string MenuPath = "Tools/MenuSet";
    private static bool _isChecked;

    static MenuTest()
    {
        if (!StartUpData.instance.IsStartUp()) return;
        EditorApplication.delayCall += Load;
    }

    private static void Load()
    {
        _isChecked = !string.IsNullOrEmpty(EditorUserSettings.GetConfigValue(MenuPath));
        Menu.SetChecked(MenuPath, _isChecked);
        EditorApplication.delayCall -= Load;
    }
    
    [MenuItem(MenuPath)]
    private static void Execute()
    {
        _isChecked = !_isChecked;
        Menu.SetChecked(MenuPath, _isChecked);
        EditorUserSettings.SetConfigValue(MenuPath, _isChecked ? "true" : null);
    }
}

エディタの起動時のみ処理を行う

[InitializeOnLoad]ScriptableSingletonを組み合わせてエディタ起動時のみ処理を行うようにしています。

[InitializeOnLoad]
public static class Sample
{
    private class StartUpData : ScriptableSingleton<StartUpData>
    {
        private int _count;

        public bool IsStartUp()
            => _count++ == 0;
    }

    static Sample()
    {
        if (!StartUpData.instance.IsStartUp()) return;
        // 起動時の処理
    }
}

docs.unity3d.com
docs.unity3d.com

初期化の処理を遅らせる

インスペクターの更新が全て終わった後に初期化処理を行います。これをしないとMenu.SetCheckedが正しく動作しません。

EditorApplication.delayCall += Load;

EditorApplication.delayCall -= Load;

docs.unity3d.com

データをストレージに書き込む

メモリにあるデータをストレージに書き込み、エディタを閉じても消えないようにします。

// セーブ
EditorUserSettings.SetConfigValue(MenuPath, _isChecked ? "true" : null);

// ロード
EditorUserSettings.GetConfigValue(MenuPath);


www.hanachiru-blog.com