はなちるのマイノート

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

【Unity】Project Settings・PreferencesにSettingsProviderを用いて独自項目を追加する(IMGUI,UIToolkit(UIElements)それぞれのやり方紹介)

はじめに

今回はSettingsProviderを用いて、Project SettingsPreferencesに独自の項目を追加してみようという記事になります。

docs.unity3d.com

f:id:hanaaaaaachiru:20220412202954p:plain
Project Settingsに独自項目を追加した様子
f:id:hanaaaaaachiru:20220412203927p:plain
Preferencesに独自項目を追加した様子
f:id:hanaaaaaachiru:20220412210809p:plain
UI Toolkitを利用した様子

一応注意点としてはSettingsProviderUnity2018.3から対応しているので、それ未満では利用できないです。

f:id:hanaaaaaachiru:20220412200547p:plain
対応しているバージョンについて

概要

SettingsProviderProject SettingsPreferenceがどのように表示されるかを指定するクラスになります。

SettingsProvider is the configuration class that specifies how a Project setting or a preference should appear in the Settings or Preferences window.

Unity - Scripting API: SettingsProvider

また描画するコードはIMGUIUI Toolkit(UIElements)のどちらも対応しているようですね。

項目を追加する

Project Settings

[SettingsProvider]
public static SettingsProvider CreateCustomSettingsProvider()
{
    // Project Settingsのどの場所に項目を追加するか
    var path = "Project/CustomSetting/Sample";
        
    // SettingsScope.Projectを指定することでProject Settingsに項目を追加できる
    var provider = new SettingsProvider(path, SettingsScope.Project)
    {
        // 項目のタイトル
        label = "Sample",
            
        // どのように描画するか(IMGUI)
        guiHandler = searchContext =>
        {
            EditorGUILayout.LabelField("これはSettingsProviderにより追加した独自項目です。");
        },
            
        // 検索するときのキーワード
        keywords = new HashSet<string>(new[]{ "CustomSetting" }),
    };

    return provider;
}
f:id:hanaaaaaachiru:20220412202954p:plain
実際の描画

ちなみにpathProject/〇〇以外にすると、表示が以下のように分かれるようになります。

f:id:hanaaaaaachiru:20220412203655p:plain
Pathを変えると・・・

Preference

Preferenceに独自項目を追加したい場合はSettingsProviderのコンストラクタでSettingsScope.Userを指定してあげればできます。

[SettingsProvider]
public static SettingsProvider CreateCustomSettingsProvider()
{
    // Preferencesのどの場所に項目を追加するか
    var path = "Preferences/CustomSetting/Sample";
        
    // SettingsScope.Projectを指定することでProject Settingsに項目を追加できる
    var provider = new SettingsProvider(path, SettingsScope.User)
    {
        // 項目のタイトル
        label = "Sample",
            
        // どのように描画するか(IMGUI)
        guiHandler = searchContext =>
        {
            EditorGUILayout.LabelField("これはSettingsProviderにより追加した独自項目です。");
        },
            
        // 検索するときのキーワード
        keywords = new HashSet<string>(new[]{ "CustomSetting" }),
    };

    return provider;
}
f:id:hanaaaaaachiru:20220412203927p:plain
Preferencesに独自項目を追加

描画フレームワーク

IMGUI

IMGUIを利用する場合は、今まで紹介してきた通りguiHandlerを利用します。

var provider = new SettingsProvider(path, SettingsScope.Project)
{
    // 項目のタイトル
    label = "Sample",
            
    // どのように描画するか(IMGUI)
    guiHandler = searchContext =>
    {
        EditorGUILayout.LabelField("これはSettingsProviderにより追加した独自項目です。");
    },
            
    // 検索するときのキーワード
    keywords = new HashSet<string>(new[]{ "CustomSetting" }),
};

UI Toolkit(UIElements)

UI Toolkit(UI Elements)を利用する場合はactivateHandlerを利用します。

var provider = new SettingsProvider(path, SettingsScope.Project)
{
    // 項目のタイトル
    label = "Sample",
            
    // どのように描画するか(UI Elements)
    activateHandler = (searchContext, rootElement) =>
    {
        // UXMLを取得
        var uxml = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Editor/SettingsUI.uxml").CloneTree();
                
        // USSを取得
        var styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>("Assets/Editor/SettingsUI.uss");

        uxml.styleSheets.Add(styleSheet);
                
        rootElement.Add(uxml);
    },
            
    // 検索するときのキーワード
    keywords = new HashSet<string>(new[]{ "CustomSetting" }),
};
// SettingsUI.uxml
<UXML xmlns="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements">
    <!-- ラベルを一つ追加 -->
    <Label text="これはSettingsProviderにより追加した独自項目です。" />
</UXML>
// SettingsUI.uss
Label {
    font-size: 20px;
    -unity-font-style: bold;
    color: rgba(255, 0, 0, 1)
}
f:id:hanaaaaaachiru:20220412210809p:plain
描画した様子

補足

SettingsProviderを継承して実装する方法もありますので、そちらも知りたい方は公式ドキュメントを参照してみてください。
Unity - Scripting API: SettingsProvider

またSettingsProviderのプロパティもlabelguiHandleractivateHandlerkeywords以外にも複数ありますので、よりカスタマイズしたい方はそちらも参照してみてください。