Help us understand the problem. What is going on with this article?

Unityを5.3.xにアップデートしたらInspectorの変更が保存されなくなってしまった…。 (´・ω・`)

More than 3 years have passed since last update.

概要

Editor拡張してInspectorの表示をカスタムしていたのですが、Unityを5.3.xにアップデートしたらその値が保存されなくなってしまった、というお話を綴ります。

※尚、まだ充分な調査/検証ができていないです。

事例

サンプルコード : 保存されない(旧来)Ver.

TestClass.cs
using UnityEngine;
using System.Collections;
#if UNITY_EDITOR
using UnityEditor;
#endif

/* -- 基礎クラス -- */
public class TestClass : MonoBehaviour
{
    [SerializeField]
    int     myInt   = 0;


#if UNITY_EDITOR
    /* -- Editor拡張クラス -- */
    [CustomEditor(typeof(TestClass))]
    public class TestClassEditor : Editor
    {
        public override void OnInspectorGUI()
        {
            TestClass tc = target as TestClass;

            tc.myInt = EditorGUILayout.IntField( tc.myInt );
        }
    }
#endif
}

サンプルコード : 保存される(模索)Ver.

TestClass.cs
using UnityEngine;
using System.Collections;
#if UNITY_EDITOR
using UnityEditor;
#endif

/* -- 基礎クラス -- */
public class TestClass : MonoBehaviour
{
    [SerializeField]
    int     myInt   = 0;


#if UNITY_EDITOR
    /* -- Editor拡張クラス -- */
    [CustomEditor(typeof(TestClass))]
    public class TestClassEditor : Editor
    {
        // 経由用
        SerializedProperty intProperty;

        void OnEnable()
        {
            // 基礎クラスからmyIntをSerializedPropertyで受け取る
            intProperty = serializedObject.FindProperty( "myInt" );
        }
        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            // 編集中はSerializedProperty経由で
            intProperty.intValue = EditorGUILayout.IntField( intProperty.intValue );

            serializedObject.ApplyModifiedProperties();
        }
    }
#endif
}

基礎クラスのパラメタを SerializedProperty 経由で取り扱い、 ApplyModifiedProperties() することで保存されるようになるみたい。

もしかしてEditor拡張ってこの手法がメジャーなのかな…?

これ使うと、パラメタの変更がUnity側に検知される(閉じるときにセーブするか訊かれる)し、Undoもできる…!

問題点/懸念点

  • 拡張パラメタが多いとリプレイスするのがしんどい
  • そもそもこの現象が仕様なのかバグなのか判らない

↑に対するとりあえずの打開案

色々手探りしているうちに、 SaveScene() 呼ぶとちゃんと保存されることに気が付いたので、セーブボタンつけてみたよ。

サンプルコード : 旧来Ver.向け打開案

TestClass.cs
using UnityEngine;
using System.Collections;
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.SceneManagement;  //!< 追加
#endif

public class TestClass : MonoBehaviour
{
    [SerializeField]
    int     myInt   = 0;


#if UNITY_EDITOR
    /** -- Editor拡張クラス -- */
    [CustomEditor(typeof(TestClass))]
    public class TestClassEditor : Editor
    {
        public override void OnInspectorGUI()
        {
            TestClass tc = target as TestClass;

            tc.myInt = EditorGUILayout.IntField( tc.myInt );

            // セーブボタン (マルチシーン?知らない子ですね。)
            if( GUILayout.Button( "Save!!" ) )
                EditorSceneManager.SaveScene( EditorSceneManager.GetActiveScene() );
        }
    }
#endif
}

結局、Ctrl+Sとかではセーブできていないんだけど、
既にいっぱいあるパラメタを全部SerializedPropertyに置き換えるよりは簡単かなって…。

(書いてて思ったけど、このSceneManager辺りの改修が影響してたりするのかな…?)

何かわかったらまた追記する(かも)よ!

sango
広く浅くつまみ食いしてます。 _(:3」∠)_ その浅さ故に誤った情報を投稿してしまうことも多々あるかと思います。 先んじてお詫び申し上げます。 m(_ _)m 御免!
https://twitter.com/con_ton
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした