Оглавление:
-
Что это такое и зачем оно нужно
-
Плюсы и минусы
-
Как с этим работать
-
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"; }
Плюсы:
-
Сериализация реализаций абстракции
-
Отказ от изменения реализации поведения через интерфейс и множество реализаций через 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
ссылка на оригинал статьи https://habr.com/ru/articles/582574/
Добавить комментарий