Unity 6.3
0 онлайн 46 гостей 3 в системе
Вход
Модульная игровая архитектура на ScriptableObjects Глава 2 из 12 Оригинал, стр. 6

Что такое ScriptableObject?

Что такое ScriptableObject?

ScriptableObject - это объект Unity, который не является частью экземпляра GameObject. На его основе можно создать пользовательский класс с собственными переменными и методами, но с меньшими накладными расходами, чем у MonoBehaviour. У ScriptableObject нет Transform, и он находится вне иерархии сцены. Такой объект существует на уровне проекта в виде ассета, подобно материалу или 3D-модели. Объявить ScriptableObject можно следующим образом:

C#
[CreateAssetMenu(fileName="MyScriptableObject")] public class MyScriptableObject: ScriptableObject { public int someVariable; }

Как видно из приведенного кода, класс наследуется не от MonoBehaviour, а от ScriptableObject. ScriptableObject нельзя напрямую прикрепить к GameObject. Вместо этого атрибут CreateAssetMenu добавляет соответствующую команду в меню.

Откройте Assets > Create > MyScriptableObject или щелкните правой кнопкой мыши в окне Project, чтобы создать пользовательский ассет на основе класса ScriptableObject.

Создание ScriptableObject

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

C#
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».