はなちるのマイノート

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

【Unity】エディタ拡張の設定をEditorUserSettingsで保存する

はじめに

今回はEditorUserSettingsについて取り上げたいと思います。
stephenhodgson.github.io

f:id:hanaaaaaachiru:20211217015503g:plain
EditorUserSettingsを利用して前回の設定を引き継ぐようにする

概要

プロジェクト単位でエディタ情報を保存するためにEditorUserSettingsを利用します。

またデフォルトでUnityの.gitignoreに含まれているので、各個人のエディタの設定を保存するといった使い方が適しているでしょう。

使い方

基本使うのは以下の二つのメソッドのみです。

// セーブ
public static void SetConfigValue(string name, string value)

// ロード
public static string GetConfigValue(string name)

これらのデータはUserSettings/EditorUserSettings.assetに格納されます。(以前はLibrary/EditorUserSettings.assetに格納されていましたが、2020.1時点ではUserSettingsに変更されているようです)

f:id:hanaaaaaachiru:20211217012427p:plain
保存先
public class EditorUserSettingsSample : MonoBehaviour
{
    [ContextMenu("Save")]
    public void Save()
    {
        EditorUserSettings.SetConfigValue("Key", "value");
        Debug.Log("Save");
    }

    [ContextMenu("Load")]
    public void Load()
    {
        var data = EditorUserSettings.GetConfigValue("Key");
        
        if(data == null) Debug.Log("Keyで保存されたデータはありません");
        else Debug.Log($"Load : {data}");
    }
}

応用例

エディタ拡張での設定を保存しておくのに利用することができます。

public class SampleWindow : EditorWindow
{
    private const string Key = "Season";
    
    private enum Season
    {
        Spring,
        Summer,
        Autumn,
        Winter
    }
    private Season _season;

    [MenuItem("Tools/SampleWindow")]
    private static void OpenWindow()
    {
        var window = GetWindow<SampleWindow>("SampleWindow");
        
        // ウィンドウ起動時、前回の設定を引き継ぐ
        var season = EditorUserSettings.GetConfigValue(Key);
        if(!string.IsNullOrEmpty(season)) window._season = (Season)Enum.Parse(typeof(Season), season, true);
    }

    private void OnGUI()
    {
        var season = (Season)EditorGUILayout.EnumPopup("Season: ", _season);
        if (season != _season)
        {
            _season = season;
            // 値が変更されたら、設定を保存しておく
            EditorUserSettings.SetConfigValue(Key, _season.ToString());
        }
    }
}
f:id:hanaaaaaachiru:20211217015503g:plain
EditorUserSettingsを利用して前回の設定を引き継ぐようにする

もしEditorUserSettingsを使わなかった場合、ウィンドウを新しく作成する度に_seasonはデフォルト値になってしまいます。

しかしランタイム(ゲーム内)でデータを利用したいといった場合には、ScriptableObjectを利用する方が良いでしょう。