【Unity】Settingに項目を追加する

独自の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メソッド内に配置するのが一般的です。

最後に

後は、設定した項目を必要な箇所で利用します。