Что такое ScriptableObject?
Что такое ScriptableObject?
ScriptableObject - это объект Unity, который не является частью экземпляра GameObject. На его основе можно создать пользовательский класс с собственными переменными и методами, но с меньшими накладными расходами, чем у MonoBehaviour. У ScriptableObject нет Transform, и он находится вне иерархии сцены. Такой объект существует на уровне проекта в виде ассета, подобно материалу или 3D-модели. Объявить ScriptableObject можно следующим образом:
[CreateAssetMenu(fileName="MyScriptableObject")] public class MyScriptableObject: ScriptableObject { public int someVariable; }Как видно из приведенного кода, класс наследуется не от MonoBehaviour, а от ScriptableObject. ScriptableObject нельзя напрямую прикрепить к GameObject. Вместо этого атрибут CreateAssetMenu добавляет соответствующую команду в меню.
Откройте Assets > Create > MyScriptableObject или щелкните правой кнопкой мыши в окне Project, чтобы создать пользовательский ассет на основе класса ScriptableObject.
Создание ScriptableObject
После этого любой другой скрипт сможет ссылаться на данный ассет ScriptableObject из любой сцены с помощью поля:
public class MyMonoBehaviour : MonoBehaviour { public ScriptableObject soInstance; }Объекты ScriptableObject особенно полезны для данных, которые не требуется изменять во время выполнения.
Объекты ScriptableObject являются полноправными объектами Unity, поэтому их можно: - Хранить в переменных - Динамически создавать и уничтожать во время выполнения - Передавать в качестве аргументов - Возвращать из методов - Включать в структуры данных - Сериализовать и десериализовать Последний пункт отражает одну из ключевых особенностей объектов ScriptableObject: они могут отображаться в окне Inspector. Благодаря этому их поля удобно просматривать и изменять в редакторе Unity. Если изменить значения объекта ScriptableObject во время выполнения, игра обновится сразу. После выхода из режима Play эти значения сохранятся. Это удобно для гейм-дизайнеров, которым нужно настраивать баланс без написания кода. Кроме того, объекты ScriptableObject часто сохраняют изменения во время работы приложения, что дает им ряд преимуществ по сравнению с использованием только MonoBehaviour.
Сериализация Сериализация - это автоматическое преобразование структур данных или состояний объектов в формат, который удобно хранить и позднее восстанавливать. Система сериализации Unity собирает разрозненные в памяти данные и располагает их последовательно. Полученный поток данных можно сохранить в базе данных, файле или памяти. Десериализация выполняет обратное преобразование.
Сериализация
Объект
Файл
Байты
Десериализация
Байты
Объект
База данных
Память
Сериализация преобразует объект в поток байтов, чтобы сохранить его либо передать в память, базу данных или файл.
При разработке на C# легко не задумываться об организации памяти, однако важно знать, какие встроенные возможности Unity используют сериализацию: - Сохранение и загрузка: если открыть файл сцены .unity в текстовом редакторе и включить принудительную текстовую сериализацию, сериализатор будет использовать YAML в качестве внутреннего формата.
- Окно Inspector: этот интерфейс не обращается к API C#, чтобы получить значения проверяемого объекта. Вместо этого он просит объект сериализовать себя и отображает полученные данные. - Префабы: внутри префаб представляет собой сериализованный поток данных объектов GameObject и компонентов. Экземпляр префаба хранит список изменений, которые следует применить поверх сериализованных данных. - Создание экземпляра: при создании экземпляра префаба или объекта GameObject на сцене Unity сериализует исходный объект, создает новый, а затем десериализует данные в новый объект. Подробнее о сериализации в Unity см. в этой статье блога и видео «Как работает система сериализации Unity».