ちゃこブログ

お絵かきとUnityとBlenderと日記

【Unity制作日記】Preferenceウインドウ Unity2019対応

 Editor拡張でPreferenceウインドウに設定等を追加することがあると思いますが、Unity2019で実装方法が思いっきり変更になってるのでメモ。

docs.unity3d.com

Unity2019.1で[PreferenceItem]が利用できなくなったので、後継の実装となる[SettingsProvider]を使ってスクリプトを書き替えていきます。すべて上記のリファレンスに全部書いてある通りです。

従来のコード
[PreferenceItem( "UnityEditorMemo" )]
public static void PreferenceView() {
   // GUIコード
}
新しいコード
[SettingsProvider]
public static SettingsProvider PreferenceView() {
    var provider = new SettingsProvider( "Preferences/UnityEditorMemo", SettingsScope.User ) {
        label = "UnityEditorMemo", // メニュー名やタイトルで利用される
        guiHandler = ( searchText ) => {
            // ここに従来のGUIコードを転記
        },
        keywords = new HashSet<string>( new[] { "UnityEditormemo" } ) // 検索でヒットさせたいワード
    };
    return provider;
}

f:id:charcotte:20190328001659p:plain

 2018から見た目の変更はなさそうですが、コードは結構変更になってますね。SettingsProvider属性をつけた関数がSettingsProviderクラスを作成して返すような流れになっています。

 SettingsProviderの第一引数に設定ウインドウ内のメニューのパスを指定します。PreferenceウインドウであればPreferences/を先頭につけるのがマナーっぽいです。パスを掘り下げればツリービューの階層が作れるので何かに利用できそうです。ここで指定したパスはどこにも表示されず、Preference以下のメニューの並び順に使われているようです。メニューはアルファベット順に並ぶみたいなので、順番を早くしたい・遅くしたいとかがあれば適当な文字列を入れるのもアリなのかもしれません。
 第二引数はPreferencesウインドウに設定を追加するか、Projectウインドウに追加するかを指定します。Projectウインドウにメニューを追加することを考えたことがなかったので、使うかどうか微妙な感じです。

Preferences/HOGEHOGEのPreferencesのスペルを間違えると鬱陶しいことになるので、パスは必ずPreferences/の直下に入れた方がよさそうです。

f:id:charcotte:20190328001847p:plain

 Unity2018.3でもSettingsProviderは利用できるようでした。[PreferenceItem]が死ぬのは2019.1からなので今のうちにSettingsProviderに書き換えてしまうのもアリですね。

 リファレンスのEditor実装がIMGUIが利用されたものになってるので、こっちもそろそろちゃんと勉強しなきゃなと感じました。( ^)o(^ )