Описание
Интерфейс для получения обратных вызовов при сериализации и десериализации.
Сериализатор Unity может сериализовать большинство типов данных, но не все. В таких случаях доступны два обратных вызова для ручной обработки этих типов данных, чтобы Unity могла сериализовать и десериализовать их.
При работе с этими обратными вызовами необходимо соблюдать осторожность, поскольку сериализатор Unity работает в потоке, отличном от большинства API Unity. Рекомендуется обрабатывать только поля, непосредственно принадлежащие объекту, чтобы минимизировать нагрузку на обработку.
Сериализация может происходить во время всех видов операций. Например, при использовании Instantiate() для клонирования объекта Unity сериализует и десериализует исходный объект, чтобы найти внутренние ссылки на исходный объект и заменить их ссылками на клонированный объект. В этой ситуации вы также можете использовать обратные вызовы для обновления любых внутренних ссылок, используя типы, которые Unity не может сериализовать.
Интерфейс обратного вызова работает только с классами. Он не работает со структурами.
Этот интерфейс поддерживается для объектов, на которые ссылается SerializeReference. Порядок выполнения обратного вызова между такими объектами не гарантируется. Однако гарантируется, что обратный вызов OnBeforeSerialize основного объекта будет вызываться до тех, которые реализованы объектами, на которые ссылаются. И OnAfterDeserialize для основного объекта будет вызываться после того, как он будет вызван для всех объектов, на которые ссылаются.
using UnityEngine;
using System;
using System.Collections.Generic;
public class SerializationCallbackScript : MonoBehaviour, ISerializationCallbackReceiver
{
public List _keys = new List { 3, 4, 5 };
public List _values = new List { "I", "Love", "Unity" };
//Unity doesn't know how to serialize a Dictionary
public Dictionary _myDictionary = new Dictionary();
public void OnBeforeSerialize()
{
_keys.Clear();
_values.Clear();
foreach (var kvp in _myDictionary)
{
_keys.Add(kvp.Key);
_values.Add(kvp.Value);
}
}
public void OnAfterDeserialize()
{
_myDictionary = new Dictionary();
for (int i = 0; i != Math.Min(_keys.Count, _values.Count); i++)
_myDictionary.Add(_keys[i], _values[i]);
}
void OnGUI()
{
foreach (var kvp in _myDictionary)
GUILayout.Label("Key: " + kvp.Key + " value: " + kvp.Value);
}
}
Публичные Методы
OnAfterDeserialize | Реализовывает этот метод для получения обратного вызова после того, как Unity десериализует ваш объект. |
OnBeforeSerialize | Реализовывает этот метод для получения обратного вызова до того, как Unity сериализует ваш объект. |