うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】Preference や Project Settings に メニューを追加する

PreferenceItem を使おうと思ったら obsolete になっていたため
推奨されている SettingsProvider についてまとめる

  /// <summary>
  ///   <para>(Obsolete: use the SettingsProvider class instead) The PreferenceItem attribute allows you to add preferences sections to the Preferences window.</para>
  /// </summary>
  [Obsolete("[PreferenceItem] is deprecated. Use [SettingsProvider] instead.")]
  [AttributeUsage(AttributeTargets.Method)]
  public sealed class PreferenceItem : Attribute

SettingsProvider

Preference に加え Project Settings にも表示できるようになったクラスの模様

単純に表示させるだけなら 以下のコードでいけそう

表示させる場所は SettingsScope を変更することでいけます
両方ともに表示させたい場合は下記のようにどちらも定義しておけば両方に表示されます

public class ProjectSettingsProvider : SettingsProvider
{
    private ProjectSettingsProvider(string path, SettingsScope scopes, IEnumerable<string> keywords = null) : base(path, scopes, keywords) { }

    public override void OnGUI(string searchContext)
    {
        EditorGUILayout.LabelField("test");
    }

    /// <summary>
    /// Project Settings に表示させる
    /// </summary>
    /// <returns></returns>
    [SettingsProvider]
    public static SettingsProvider RegisterProject()
    {
        return new ProjectSettingsProvider("Tools/", SettingsScope.Project)
        {
            label = "Sample",
        };
    }

    /// <summary>
    /// Preference に表示させる
    /// </summary>
    /// <returns></returns>
    [SettingsProvider]
    public static SettingsProvider RegisterUser()
    {
        return new ProjectSettingsProvider("Tools/", SettingsScope.User)
        {
            label = "Sample",
        };
    }

f:id:hacchi_man:20201027033016p:plain:w300

各ウィンドウにある検索で見つかるようにしたい場合は、第3引数に文字列を渡してやれば検索に引っかかるようになります

return new ProjectSettingsProvider("Tools/", SettingsScope.User, new [] {"Sample"})

f:id:hacchi_man:20201027033219p:plain:w200



SettingsProvider を継承しなくても、guiHandler等 描画の処理は登録できるので
メソッドを定義すればどこでも使えるが、ややこしくなるので個人的には継承して使いたいところ

[SettingsProvider]
public static SettingsProvider RegisterUser()
{
    return new ProjectSettingsProvider("Tools/", SettingsScope.User)
    {
        guiHandler = str => EditorGUILayout.LabelField("Test"),
        label = "Sample",
    };
}

Override Methods

override できるメソッド一覧

/// <summary>
/// 設定画面が表示されたタイミング
/// </summary>
public override void OnActivate(string searchContext, VisualElement rootElement)
{
    base.OnActivate(searchContext, rootElement);
}

/// <summary>
/// 設定画面が非表示になったタイミング
/// </summary>
public override void OnDeactivate()
{
    base.OnDeactivate();
}

/// <summary>
/// 検索窓に文字が入力されたタイミング
/// </summary>
public override bool HasSearchInterest(string searchContext)
{
    return base.HasSearchInterest(searchContext);
}

/// <summary>
/// 設定画面
/// </summary>
public override void OnGUI(string searchContext)
{
    base.OnGUI(searchContext);
}

/// <summary>
/// タイトルのGUI
/// </summary>
public override void OnTitleBarGUI()
{
    base.OnTitleBarGUI();
}

/// <summary>
/// フッターのGUI
/// </summary>
public override void OnFooterBarGUI()
{
    base.OnFooterBarGUI();
}

/// <summary>
/// 10フレーム毎に呼び出される
/// </summary>
public override void OnInspectorUpdate()
{
    base.OnInspectorUpdate();
}