はなちるのマイノート

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

【Unity】EditorWindowでEditorGUILayout.PropertyField&SerializedObject.FindPropertyをしてもデフォルト値にクリアされてしまう問題の対処法

はじめに

以下のコードを書いていたところ、Unity2022.3.10f1では正しく動作しないことに気がつきました。(Unity6では正しく動作していました)

using UnityEditor;
using UnityEngine;

public class SampleWindow : EditorWindow
{
    [SerializeField] private string[] _texts;

    [MenuItem("Tools/SampleWindow")]
    public static void Open()
    {
        GetWindow<SampleWindow>();
    }

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

        // EditorWindowには正しく表示されているが、入力してもデフォルト値に戻ってしまう
        EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(_texts)), true);
        
        serializedObject.ApplyModifiedProperties();
    }
}
入力してもデフォルト値に戻ってしまう

対処法

OnGUIで毎回SerializedObjectを生成せずにキャッシュするようにしたら直りました。

using UnityEditor;
using UnityEngine;

public class SampleWindow : EditorWindow
{
    [SerializeField] private string[] _texts;

    private SerializedObject _serializedObject;
    
    [MenuItem("Tools/SampleWindow")]
    public static void Open()
    {
        GetWindow<SampleWindow>();
    }

    private void OnGUI()
    { 
        _serializedObject ??=  new SerializedObject(this);
        _serializedObject.Update();
        
        // ちゃんと入力されるようになった
        EditorGUILayout.PropertyField(_serializedObject.FindProperty(nameof(_texts)), true);
        
        _serializedObject.ApplyModifiedProperties();
    }
}
正しく入力できるようになった様子