分配给带有 SerializeReference 属性的字段的对象。
当 propertyType 为 SerializedPropertyType.ManagedReference 时使用。
值对象必须是与托管引用字段的基本类型兼容的类型(即序列化属性引用的托管引用字段)。
其他资源:SerializeReference、propertyType、SerializedPropertyType.ManagedReference。
using System; using System.Collections.Generic; using UnityEditor; using UnityEngine; using Object = UnityEngine.Object;
public class SerializedPropertyManagedReferenceValueExample : ScriptableObject { [Serializable] public class Item { public int m_data = 1;
public int DoCalculation() { // Could be querying some external data, or other calculation that cannot be // made entirely based on the local object state m_data++; return m_data * 2; } }
[SerializeReference] public Item m_Item;
[MenuItem("Example/SerializedProperty ManagedReferenceValue Example1")] static void TestMethod1() { var scriptableObject = ScriptableObject.CreateInstance<SerializedPropertyManagedReferenceValueExample>(); var serializedObject = new SerializedObject(scriptableObject);
// Allocate and assign an object to the m_Item field via managedReferenceValue var referenceProperty = serializedObject.FindProperty("m_Item"); referenceProperty.managedReferenceValue = new Item();
// Change a value of the object's field referenceProperty.FindPropertyRelative("m_data").intValue = 99;
// Apply the change back to the "live" object serializedObject.ApplyModifiedProperties();
// Will print "Value of m_data: 99" Debug.Log("Value of m_data: " + scriptableObject.m_Item.m_data); }
[MenuItem("Example/SerializedProperty ManagedReferenceValue Example2")] static void TestMethod2() { var scriptableObject = ScriptableObject.CreateInstance<SerializedPropertyManagedReferenceValueExample>(); scriptableObject.m_Item = new Item();
var serializedObject = new SerializedObject(scriptableObject); var referenceProperty = serializedObject.FindProperty("m_Item");
// The "live" referenced object can be accessed so we can call a method on it (referenceProperty.managedReferenceValue as Item).DoCalculation();
// The serialized state inside the SerializedObject is now out of data with the change // of m_data on the live object, but can be brought back in sync by calling Update() var serializedDataValue = serializedObject.FindProperty("m_Item.m_data").intValue; serializedObject.Update(); var updatedSerializedDataValue = serializedObject.FindProperty("m_Item.m_data").intValue;
// Will print: "Value of m_data before update: 1 and after update: 2" Debug.Log("Value of m_data before update: " + serializedDataValue + " and after update: " + updatedSerializedDataValue); } }