独自のSettingを追加したい場合のやり方を調べてみました。
サンプルコード
次のコードはProjectSettingに項目を追加する最小限のコードになります。 SettingProviderを継承したクラスを作成し、コンストラクタなどを追加します。
public class AnotherSettingProvider : SettingsProvider { public AnotherSettingProvider(string path, SettingsScope scopes, IEnumerable<string> keywords = null) : base(path, scopes, keywords) { } [SettingsProvider] public static SettingsProvider CreateAnotherSettingsProvider() { var provider = new AnotherSettingProvider("Preferences/Another Setting", SettingsScope.User); return provider; } }
SettingsScope
SettingsScopeはSettingsWindowかPreferencesWindowに項目するかどうかで設定が変わります。 SettingsScope.Userにして、今回はPreferencesWindowに項目を追加しています。
項目の中身を書く
OnGUIに項目の中身を記載します。
public override void OnGUI(string searchContext) { EditorGUILayout.LabelField("This is another setting provider"); }
保存する用のScriptableObjectを用意する
settingの内容を保存するScriptableObjectを用意します。
public class NewProjectSetting : ScriptableObject { public bool hoge = false; }
こちらのScritableObjectを表示するようAnotherSettingProviderを調整します。
private static NewProjectSetting _settings; private SerializedObject _setting; private const string path = "Assets/AnotherSetting.asset"; public override void OnActivate(string searchContext, VisualElement rootElement) { _settings = AssetDatabase.LoadAssetAtPath<NewProjectSetting>(path); if (_settings == null) { var setting = ScriptableObject.CreateInstance<NewProjectSetting>(); AssetDatabase.CreateAsset(setting, path); } _setting = new SerializedObject(_settings); } public override void OnGUI(string searchContext) { if (_settings == null) return; _setting.Update(); EditorGUILayout.PropertyField(_setting.FindProperty("hoge")); _setting.ApplyModifiedProperties(); }
次のように表示されます。
このScripatbleObjectを使って必要な処理を実装できます。
OnActivate
OnActivateメソッドは設定プロバイダがアクティブになる時(つまりユーザが設定ウィンドウを開いた時)に呼び出されます。 そのため、設定ウィンドウが開かれた際に必要なセットアップ、例えば設定のロードやUIの更新などのコードは、OnActivateメソッド内に配置するのが一般的です。
最後に
後は、設定した項目を必要な箇所で利用します。