Как стать автором
Обновить

Serialize Reference в Unity

Уровень сложностиПростой
Время на прочтение2 мин
Количество просмотров11K

Оглавление:

  • Что это такое и зачем оно нужно

  • Плюсы и минусы

  • Как с этим работать

  • 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

Теги:
Хабы:
Всего голосов 5: ↑2 и ↓3-1
Комментарии0

Публикации

Истории

Работа

Ближайшие события