Искать на сайте Unity

Переименование сериализованых полей

3 февраля 2015 г. через Engine & platform | 2 мин. читать
Охваченные темы
Поделиться

Is this article helpful for you?

Thank you for your feedback!

Некоторые из вас, возможно, знают, что мы создали большую часть новой системы UI как пользовательские скрипты. Мы столкнулись с большинством ограничений, с которыми сталкиваются наши пользователи при разработке в Unity и расширении редактора. В процессе разработки мы исправили проблемы, с которыми столкнулись. Сегодня мы хотели бы рассказать об одной из них.

Проблема заключалась в том, что, когда мы переименовывали поля, наши пользователи теряли данные. Во время бета-тестирования мы хотели изменить наш код, не портя при этом проекты пользователей бета-версии, чтобы они могли продолжить тестирование каждой новой версии, не беспокоясь о потере данных. Чтобы решить эту проблему, мы ввели атрибут [FormerlySerializedAs].

Что это вам дает? Давайте рассмотрим некоторые варианты использования!

Переименование переменной

Допустим, у вас есть следующий класс:

[csharp]
using UnityEngine;
class MyClass : MonoBehaviour
{
[SerializeField]
private string m_MyVariable;
}
[/csharp]

Но вы хотели бы переименовать m_MyVariable, например, на m_ABetterName, и вы не хотите, чтобы ваши пользователи повторно заполняли данные для этого скрипта во всех своих сценах и/или префабах. Сделать это можно следующим образом:

[csharp]
using UnityEngine;
using UnityEngine.Serialization;
class MyClass : MonoBehaviour
{
[FormerlySerializedAs("m_MyVariable")]
[SerializeField]
private string m_ABetterName;
}
[/csharp]

Инкапсуляция публичного API

В этом примере у вас есть публичное поле, которое является частью вашего API, но хотелось бы оформить его как метод доступа. Итак, давайте предположим у нас есть класс MyClass:

[csharp]
using UnityEngine;
class MyClass : MonoBehaviour
{
public string myValue;
}
[/csharp]

Для инкапсуляции этого значения в метод доступа без потери существующих данных в ваших ассетах вы можете сделать что-то вроде этого:

[csharp]
using UnityEngine;
using UnityEngine.Serialization;
class MyClass : MonoBehaviour
{
[FormerlySerializedAs("myValue")]
[SerializeField]
private string m_Value;
public string myValue
{
get { return m_Value; }
set { m_Value = value; }
}
}
[/csharp]

Несколько переименований

Поддерживается переименование полей несколько раз, просто добавьте атрибут для каждого предыдущего имени поля:

[csharp]
using UnityEngine;
using UnityEngine.Serialization;
class MyClass : MonoBehaviour
{
[FormerlySerializedAs("m_MyVariable")]
[FormerlySerializedAs("m_ABetterName")]
[SerializeField]
private string m_EvenBetterName;
}
[/csharp]

Когда можно удалить атрибут?

Вы можете удалить атрибуты после того, как вы повторно сохранили все сцены и ассеты, после переименования. Конечно, это означает, что вы должны “контролировать” ваших пользователей. Но, например, для продавцов в Asset Store этот “контроль” невозможен. В этом случае вам придется оставить это атрибут до тех пор, пока вы хотите, чтобы люди с любой версией кода могли обновиться до новой версии кода без потери данных.

Надеюсь, вы найдете полезной эту новую маленькую особенность!

3 февраля 2015 г. через Engine & platform | 2 мин. читать

Is this article helpful for you?

Thank you for your feedback!

Охваченные темы
Unity, логотипы Unity и другие торговые знаки Unity являются зарегистрированными торговыми знаками компании Unity Technologies или ее партнеров в США и других странах (подробнее здесь). Остальные наименования и бренды являются торговыми знаками соответствующих владельцев.