Описание
Объект, назначенный полю с атрибутом 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();
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();
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);
}
}