Страница 1 из 1

Сериализация переменных, изменяемых из функции

СообщениеДобавлено: 26 апр 2016, 09:40
Diab10
Всем привет!

Есть класс и расширение инспектора для него:

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class myClass : MonoBehaviour
{
    public int test1 = 1;
    public int test2 = 1;


    public void testVoid()
    {
        test2 = 5;
    }
}
 


Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using UnityEditor;

[CustomEditor(typeof(myClass))]
public class myClass_Editor : Editor
{
    myClass obj = null;

    SerializedProperty test1Property;


    public void OnEnable()
    {
        obj = (myClass)target;

        test1Property = serializedObject.FindProperty("test1");
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();


        if (GUILayout.Button("Set"))
        {
            test1Property.intValue = 5;
            obj.testVoid();
        }

        serializedObject.ApplyModifiedProperties();
    }
}
 


После нажатия на кнопку "Set" - переменная test1 будет равна 5, а test2 останется равна 1.
Почему? Что сделать, чтобы test2 тоже сохранилась?

Re: Сериализация переменных, изменяемых из функции

СообщениеДобавлено: 26 апр 2016, 11:00
Diab10
Разобрался. Нужно делать сохранение serializedObject.ApplyModifiedProperties(); до вызова функции:

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using UnityEditor;

[CustomEditor(typeof(myClass))]
public class myClass_Editor : Editor
{
    myClass obj = null;

    SerializedProperty test1Property;


    public void OnEnable()
    {
        obj = (myClass)target;

        test1Property = serializedObject.FindProperty("test1");
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();


        if (GUILayout.Button("Set"))
        {
            test1Property.intValue = 5;
            serializedObject.ApplyModifiedProperties();
            obj.testVoid();
        }

        serializedObject.ApplyModifiedProperties();
    }
}


Если кто знает более удобный вариант - скажите плиз

Re: Сериализация переменных, изменяемых из функции

СообщениеДобавлено: 26 апр 2016, 11:37
llka
Раньше я бы посоветовал использовать EditorUtility.SetDirty для редактируемого объекта, но сейчас его вроде обещали заобсолютить. Проще применяйте сохранение при условии GUI.changed тогда.

Re: Сериализация переменных, изменяемых из функции

СообщениеДобавлено: 26 апр 2016, 11:44
Diab10
llka писал(а):Раньше я бы посоветовал использовать EditorUtility.SetDirty для редактируемого объекта, но сейчас его вроде обещали заобсолютить. Проще применяйте сохранение при условии GUI.changed тогда.


SetDirty я пробовал - не помогает.

Принимать сохранения при GUI.changed тоже не помогает. ApplyModifiedProperties всё сбросит.

Re: Сериализация переменных, изменяемых из функции

СообщениеДобавлено: 26 апр 2016, 12:10
llka
Принимать сохранения при GUI.changed тоже не помогает. ApplyModifiedProperties всё сбросит.

В таком случае проще уже не сделать получается.
Честно, сколько писал редакторов ни раз не пользовался еще SerializedProperty всегда на прямую обращался к переменным редактируемого компонента.

Re: Сериализация переменных, изменяемых из функции

СообщениеДобавлено: 26 апр 2016, 16:53
seaman
Ну так в мануале все это написано. В начале OnInspectorGUI нужно обязательно serializedObject.Update(); В конце serializedObject.ApplyModifiedProperties();
Есть хуже вещи. Вот я так и не понял как работать с FindPropertyRelative У меня как бы я ни крутил все время возвращает null. Делаю через ж...
Вот так:
Синтаксис:
Используется csharp
SerializedObject propObj = new SerializedObject(__currentProp.objectReferenceValue);
int idx = propObj.FindProperty("simpleProp").enumValueIndex;

Т.е. создаю временный SerializedObject и у него беру нужное проперти. Напрямую не работает:
Синтаксис:
Используется csharp
int idx = __currentProp.FindPropertyRelative("simpleProp").enumValueIndex;

всегда на прямую обращался к переменным редактируемого компонента.

А как с работой Undo/Redo? Проперти делают его автоматом.

Re: Сериализация переменных, изменяемых из функции

СообщениеДобавлено: 26 апр 2016, 18:21
llka
А как с работой Undo/Redo? Проперти делают его автоматом.

да, в курсе, но обычно у меня редакторы выполняют помимо присваивания значения переменным множество действий после который многие значения могу меняться, в таком случае SerializedProperty мало полезны, а регистрировать Undo Redo всего пару строчек. К тому же раньше был SetDirty который спокойно сохранял все изменения. Но видимо в будущем все таки придется перейти на проперти.