版本: Unity 6 (6000.0)
语言英语
  • C#

SerializedObject.Update

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交,但我们确实阅读了用户提出的每一项更改建议,并在适用的情况下进行更新。

关闭

提交失败

由于某些原因,您的更改建议无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

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()); } } }