SerializedObject.Update
Declaration
public void Update();Описание
Обновить представление сериализованного объекта.
При создании SerializedObject целевые объекты сериализуются, а API SerializedObject и SerializedProperty дают доступ к этому сериализованному представлению на чтение и запись. Если один или несколько целевых объектов изменяются — через другой экземпляр SerializedObject или прямой записью, — внутреннее сериализованное представление может рассинхронизироваться. Вызов Update() заново сериализует целевые объекты, и SerializedObject снова отражает их актуальное состояние.
Вызов Update() отбросит любые локально изменённые свойства, которые еще не были применены.
Дополнительные ресурсы: SerializedObject.hasModifiedProperties, SerializedObject.ApplyModifiedProperties
using System; using System.Text; using UnityEngine; using UnityEditor;
public class SerializeObjectUpdate : ScriptableObject { public int m_Field = 1;
[MenuItem("Example/SerializedObject Update")] static void UpdateExample() { var scriptableObject = ScriptableObject.CreateInstance<SerializeObjectUpdate>(); var sb = new StringBuilder();
using (var serializedObject = new SerializedObject(scriptableObject)) { SerializedProperty field = serializedObject.FindProperty("m_Field");
// Change underlying object scriptableObject.m_Field = 2;
// SerializedObject still thinks value is 1 sb.Append($"SerializedObject value before Update: {field.intValue} ");
//hasModifiedProperties returns false because no changes have been made via SerializedProperty API sb.Append($"(SerializedObject dirty: {serializedObject.hasModifiedProperties}), ");
// Update so that SerializedObject sees the new value serializedObject.Update(); sb.AppendLine($"after Update: {field.intValue}");
// Another scenario is when Update is called while there are pending changes in the SerializedObject field.intValue = 3; sb.Append($"SerializedObject value before Update: {field.intValue} "); sb.Append($"(SerializedObject dirty: {serializedObject.hasModifiedProperties}), ");
// Value reverts back to 2, because ApplyModifiedProperties was not called // and SerializedObject has been put back in sync with the object's state serializedObject.Update(); sb.AppendLine($"after Update: {field.intValue}. (Dirty: {serializedObject.hasModifiedProperties})");
Debug.Log(sb.ToString()); } } }