更新序列化对象的表示。
当构建 SerializedObject 时,目标对象会被序列化,并且 SerializeObject 和 SerializedProperty API 提供对该序列化表示的读写访问。如果一个或多个目标对象通过另一个 SerializedObject 实例或直接写入目标对象而发生更改,则 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()); } } }