はじめに
今回はエディタ拡張でメニューバーにチェックを付ける方法について紹介したいと思います。
やり方
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.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; // 起動時の処理 } }
初期化の処理を遅らせる
インスペクターの更新が全て終わった後に初期化処理を行います。これをしないとMenu.SetChecked
が正しく動作しません。
EditorApplication.delayCall += Load; EditorApplication.delayCall -= Load;
データをストレージに書き込む
メモリにあるデータをストレージに書き込み、エディタを閉じても消えないようにします。
// セーブ EditorUserSettings.SetConfigValue(MenuPath, _isChecked ? "true" : null); // ロード EditorUserSettings.GetConfigValue(MenuPath);