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

Раздел, посвящённый всему, что связано с программированием для Редактора Юнити. Скрипты Редактора, Wizards и прочее.

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

Сообщение Diab10 26 апр 2016, 09:40

Всем привет!

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

Синтаксис:
Используется 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 тоже сохранилась?
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

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

Сообщение Diab10 26 апр 2016, 11:00

Разобрался. Нужно делать сохранение 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();
    }
}


Если кто знает более удобный вариант - скажите плиз
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

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

Сообщение llka 26 апр 2016, 11:37

Раньше я бы посоветовал использовать EditorUtility.SetDirty для редактируемого объекта, но сейчас его вроде обещали заобсолютить. Проще применяйте сохранение при условии GUI.changed тогда.
llka
UNIверсал
 
Сообщения: 359
Зарегистрирован: 08 янв 2014, 05:00

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

Сообщение Diab10 26 апр 2016, 11:44

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


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

Принимать сохранения при GUI.changed тоже не помогает. ApplyModifiedProperties всё сбросит.
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

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

Сообщение llka 26 апр 2016, 12:10

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

В таком случае проще уже не сделать получается.
Честно, сколько писал редакторов ни раз не пользовался еще SerializedProperty всегда на прямую обращался к переменным редактируемого компонента.
llka
UNIверсал
 
Сообщения: 359
Зарегистрирован: 08 янв 2014, 05:00

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

Сообщение seaman 26 апр 2016, 16:53

Ну так в мануале все это написано. В начале 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? Проперти делают его автоматом.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

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

Сообщение llka 26 апр 2016, 18:21

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

да, в курсе, но обычно у меня редакторы выполняют помимо присваивания значения переменным множество действий после который многие значения могу меняться, в таком случае SerializedProperty мало полезны, а регистрировать Undo Redo всего пару строчек. К тому же раньше был SetDirty который спокойно сохранял все изменения. Но видимо в будущем все таки придется перейти на проперти.
llka
UNIверсал
 
Сообщения: 359
Зарегистрирован: 08 янв 2014, 05:00


Вернуться в Editor

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2