Unity 6.3
0 онлайн 1 гость 3 в системе
Вход

EditorUtility.CopySerialized

Declaration

public static void CopySerialized(Object source, Object dest);

Параметры

Параметр Описание
источник Объект, из которого будут копироваться свойства.
рука Объект для копирования свойств.

Описание

Копирует все серийные свойства объекта Unity из одного объекта в другой.

Этот метод копирует все сериализованные свойства из source возражает против dest объект, перезаписывая значения, которые в настоящее время находятся в свойствах dest. Поля, которые включены, следуют за script-сериализация-правила.

Этот метод особенно полезен при работе с объектами в ассетах. Он похож на Object.Instantiate в том, что он также копирует серийные свойства объекта, но перезаписывает существующий объект, в отличие от Instantiate который всегда создает новый объект.

Примечание: Object.hideFlags не копируются.

Если копируемый объект происходит от MonoBehaviour или ScriptableObject, то dest должен быть либо того же типа, что и source, или его базовый класс. Иначе типы dest и source должны быть равны.

Поскольку для копирования значений используется сериализатор Unity, если ISerializationCallbackReceiver.OnBeforeSerialize метод реализован, то он вызывается на source объекта перед копированием. ISerializationCallbackReceiver.OnAfterDeserialize метод реализован, он вызывается на dest объект после копирования.

Следующий пример показывает, как этот метод может быть использован для сброса свойств объекта, чтобы они соответствовали объекту 'ссылки', вместо того, чтобы вручную сбросить свойства к жестко кодированным значениям.

using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

[CreateAssetMenu]
public class CopySerializedExample : ScriptableObject
{
    // Declare some serialized fields
    public int intValue;
    public string stringValue;
    public List<bool> listOfBools;

    #if UNITY_EDITOR
    [ContextMenu("Reset to reference")]
    public void ResetToReference()
    {
        // CopySerialized will overwrite the object name as well; we don't want that
        // so save it to a temporary variable so we can restore it afterwards
        var originalName = this.name;

        var reference = AssetDatabase.LoadAssetAtPath<CopySerializedExample>("Assets/ReferenceAsset.asset");
        EditorUtility.CopySerialized(reference, this);

        // Restore the original name
        this.name = originalName;
    }
    #endif
}