语言英语
  • C#

SerializedObject.Update

声明

public void Update();

描述

更新序列化对象的表示。

当构建 SerializedObject 时,目标对象会被序列化,并且 SerializeObject 和 SerializedProperty API 提供对该序列化表示的读写访问。如果一个或多个目标对象通过另一个 SerializedObject 实例或直接写入目标对象而发生更改,则 SerializedObject 内部序列化表示可能会不同步。调用 Update() 将重新序列化目标对象,以便 SerializedObject 反映其最新状态。

调用 Update() 将丢弃尚未应用的任何本地修改的属性。

其他资源:SerializedObject.hasModifiedPropertiesSerializedObject.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()); } } }

Did you find this page useful? Please give it a rating: