Описание
Заставить Unity сериализовать закрытое поле.
Когда Unity сериализует ваши скрипты, сериализуются только общедоступные поля. Если вы также хотите, чтобы Unity сериализовала ваши личные поля, вы можете добавить к этим полям атрибут SerializeField.
Unity сериализует все ваши компоненты сценария, перезагружает новые сборки и воссоздает ваши компоненты сценария из сериализованных версий. Эта сериализация выполняется с помощью внутренней системы сериализации Unity; не с функцией сериализации .NET.
Система сериализации может делать следующее:
- МОЖЕТ сериализовать общедоступные нестатические поля (сериализуемых типов)
- МОЖЕТ сериализовать закрытые нестатические поля, помеченные атрибутом SerializeField.
- НЕ МОЖЕТ сериализовать статические поля.
- НЕ МОЖЕТ сериализовать свойства.
Сериализуемые типы
Unity может сериализовать поля следующих типов:
- Все классы, наследуемые от UnityEngine.Object, например GameObject, Component, MonoBehaviour, Texture2D, AnimationClip.
- Все основные типы данных, такие как int, string, float, bool.
- Некоторые встроенные типы, такие как Vector2, Vector3, Vector4, Quaternion, Matrix4x4, Color, Rect, LayerMask.
- Массивы сериализуемого типа
- Списки сериализуемого типа
- Перечисления
- Структуры
Дополнительную информацию о сериализации см. в разделе Сериализация сценариев.
Примечание. Если вы поместите один элемент в список (или массив) дважды, то при сериализации списка вы получите две копии этого элемента вместо одной копии в новом список дважды.
Примечание. Если вы хотите сериализовать настраиваемое поле структуры, вы должны присвоить структуре атрибут [System.Serializable].
Подсказка: Unity не будет сериализовать Dictionary, однако вы можете сохранить List<> для ключей и List<> для значений и сшить их в несериализованном словаре на Awake() . Это не решает проблему, когда вы хотите изменить словарь и «сохранить» его обратно, но это удобный трюк во многих других случаях.
using UnityEngine;
public class SomePerson : MonoBehaviour
{
//This field gets serialized because it is public.
public string firstName = "John";
//This field does not get serialized because it is private.
private int age = 40;
//This field gets serialized even though it is private
//because it has the SerializeField attribute applied.
[SerializeField]
private bool hasHealthPotion = true;
void Start()
{
if (hasHealthPotion)
Debug.Log("Person's first name: " + firstName + " Person's age: " + age);
}
}