Оглавление:
Что это такое и зачем оно нужно
Плюсы и минусы
Как с этим работать
Unity 2019.3
Что это такое и зачем оно нужно:
Serialize Reference - это атрибут, который позволяет Unity сериализовывать не только данные но и тип данных. Данный атрибут появляется в 2019 версии юнити и обновляется в последующих. С помощью него можно сериализовать поля у которых данные являются реализацией типа поля.
public class ExampleFirstMonoBehaviour : MonoBehaviour
{
[SerializeReference] private object _customObject = new ExampleFirst();
}
public class ExampleSecondMonoBehaviour : MonoBehaviour
{
[SerializeReference] private object _customObject = new ExampleSecond();
}
public class ExampleFirst
{
[SerializeField][Range(0, 5)] private float _floatValue;
}
public class ExampleSecond
{
[SerializeField] private string _stringValue = "Hello";
}
![](https://habrastorage.org/getpro/habr/upload_files/ac4/f97/98a/ac4f9798ade63777d40aca2e40f9bb25.png)
Плюсы:
Сериализация реализаций абстракции
Отказ от изменения реализации поведения через интерфейс и множество реализаций через monoBehaviour/scriptableObject
Это хранение данных единой абстракции в одном листе, вместо постоянного раздувания количества листов ради новых данных (или же работу с UnityEngine.Object)
Никаких кастомных решений для редактора. Отображение экземпляров происходит за счёт стандартных решений юнити.
Защита от Stripping Code
Минусы:
При изменении имени и неймспейса, ломается сериализация. Для того чтобы починить сериализацию после изменения имении и неймспейса, требуется использовать movefromattribute в котором будет указано, как раньше назывался данный тип, и где находился
Нет из коробки редактора и инструментария для изменения типа сериализуемого объекта/инстанса (в следующих статьях буду публиковать редактор этого)
Нетипичные проблемы с сериализацией листа. При классическм добавлении нового элемента, происходит копирование ссылки на сериализацию и таким образом при редактировании 1 из 2 последних элементов, вы будете редактировать оба.
Как с этим работать:
(Best Way) Писать редактор. Правда в 2019 версии юнити инструментарий для этого скудный.
Из юнитековского объекта, где мы можем вызывать SetDirty
Использование для сериализации реализаций
Использование для настройки типов с конструктором без параметров (Example TypeReference) с защитой от StrippingCode
Unity 2019.3:
В юнити 2019.3 у нас очень скудный инструментария для SerialzieReference:
сеттер serializedProperty.managedReferenceValue
тип поля serializedProperty.managedReferenceFieldTypename
тип значения serializedProperty.managedReferenceFullTypename
ограничения по сериализуемым объектам и полям: не дженерик типы, кроме массивов и листов. Параметры массивов и листов соответственно тоже не могут быть дженерик.
Тип поля не должен наследоваться от UnityEngine.Object