ミドリ黄のプログラミングメモノート

主にUnity(C#)を中心としたプログラムの備忘録

Unity EditorWindowの保存





導入

Editor Windowに記述した変数などはウィンドウを閉じると消えてしまいます。
そこで、データをjson形式で読み書きすることで保存が可能になるのでその方法を紹介します。

本記事は以下のUnity公式フォーラムを参考にしました。
answers.unity.com




ソースコード

こちらのクラスを継承することでEditor Windowのデータを保存することができます。
保存したデータは「Assets/EditorWindowSaveData」フォルダ内にクラス名で保存されます。

using UnityEngine;
using UnityEditor;
using System.IO;

public abstract class SaveEditorWindow : EditorWindow
{
    //Jsonファイルのパス
    string SavePath() => $"Assets/EditorWindowSaveData/{GetType()}.json";

    //開くときにセーブデータを読み込み
    protected virtual void OnEnable()
    {
        //データが存在する場合は読み込む
        if (File.Exists(SavePath()))
        {
            using (StreamReader sr = new StreamReader(SavePath()))
            {
                JsonUtility.FromJsonOverwrite(sr.ReadToEnd(), this);
            }
        }
    }


    //閉じるときにデータを保存
    protected virtual void OnDisable()
    {
        //データを保存
        using (StreamWriter sw = new StreamWriter(SavePath(), false))
        {
            string jsonstr = JsonUtility.ToJson(this, false);
            sw.Write(jsonstr);
            sw.Flush();
        }
    }
}





使用例

先ほどの「SaveEditorWindow」を継承したクラスを用意。

using UnityEngine;
using UnityEditor;

public class TestWindow : SaveEditorWindow
{
    [SerializeField] int a;
    [SerializeField] string s;

    [MenuItem("Test/TestWindow")]
    static void Init()
    {
        GetWindow(typeof(TestWindow));
    }

    private void OnGUI()
    {
        var so = new SerializedObject(this);
        so.Update();

        a = EditorGUILayout.IntField("a", a);
        s = EditorGUILayout.TextField("s", s);

        so.ApplyModifiedProperties();
    }
}


エディタ上で「Test」⇒「TestWindow」と選択してウィンドウを開いたら次のように編集する。


すると、「Assets/EditorWindowSaveData/TestWindow.json」というファイルが生成されており、次のように記述されている。

{"m_MinSize":{"x":100.0,"y":100.0},"m_MaxSize":{"x":4000.0,"y":4000.0},"m_TitleContent":{"m_Text":"TestWindow","m_Image":{"instanceID":0},"m_Tooltip":""},"m_Pos":{"serializedVersion":"2","x":378.3999938964844,"y":52.0,"width":320.8000183105469,"height":551.7999877929688},"m_ViewDataDictionary":{"instanceID":0},"m_OverlayCanvas":{"m_LastAppliedPresetName":"Default","m_SaveData":[]},"a":567,"s":"いろは"}


これにより一度「TestWindow」を閉じても、再度開くと先ほどの画像のようになる。