Приём использования ScriptableObject в Unity на примере зданий в стратегии + хак для редактора
Всем привет! Меня зовут Роман Сакутин и в этой небольшой статье я хочу рассказать об одном из приёмов использования ScriptableObject в Unity. Его я делал в одном из своих стримов на канале, на котором мы делали RTS. Задача была в следующем:
-Предоставить возможность создавать здания в редакторе для последующего строительства их игроком.
-Здания содержат следующее: модель которая отображается, имя, иконка, цена и список вещей которые могут в нём производится.
Один из важных аспектов — это то, что здание создаются в редакторе, и потом используются в различных сценах. Так что всё описание хочется иметь в виде некоторых ассетов. Также в этом вопросе важна безопасность типов, чтобы при создание нового здания было сложно сделать ошибку.
ScriptableObject
Это специальным тип Unity который позволяет сохранять объект производного от него класса как часть всего проекта а не отдельной сцены, и в дальнейшем использовать его в различных скриптах.
Можно его ассоциировать с более чистым префабом. Префаб — это GameObject сохранённый в проекте. ScriptableObject — это компонент который сохранён в проекте со всеми своими значениями.
Для начала работы вам нужно создать класс который производный от ScriptableObject. В нём вы можете определять поля которые будут сериализоваться. Правила в целом те же что и в обычных компонентах.

Наличие атрибута CreateAssetMenu позволяет создавать инстансы класса прямо в редакторе, с последующим их сохранением. Параметр menuName позволяет задать где в контекстном меню будет располагаться кнопка.


В дальнейшем вы можете использовать эти объекты просто определив поле с типов SomeData в скрипте и Unity позволит вам их перетаскивать в инспекторе как значение него.
Помимо этого есть мощный механизм работы как с ресурсом. В т.ч поиск всех объектов определённого типа и динамичное их создание прямо во время игры.
Как я применил его в системе построек
У нас есть основной тип BuildingProfile в котором собраны основные данные постройки.

В результате чего прямо в проекте мы можем конфигурировать различные здания.

За строительство отвечает компонент BuildingPanel (точнее он отвечает за выбор того), что строить.

Как вы видите здесь применялась техника загрузить все возможные здания. Так как в том примере что был на стриме, этого было вполне достаточно. В результате это всё выглядит таким вот образом.

Небольшой хак
Чтобы объекты ScriptableObject симпотично выглядили в окне Project, можно задать им иконку. Для этого в папку Gizmos положите одноименную картинку с постфиксом Icon.

В заключение
Это не единственный способ использования ScriptableObject и есть множество других интересных путей развития сценария. О них я надеюсь рассказать вам в следующий раз.
Если вам нужен проект, то вы можете получить его в специальной рассылке. В нём будут всё что мы сделали на восьми стримах. Скрипты + модели, а также интересное специальное предложение. :)
7 курсов бесплатно
Начните карьеру разработчика игр бесплатно!
Вы также можете написать нам сами на почту: romaan27@gmail.com
Вы также можете написать нам сами на почту: romaan27@gmail.com
Программист, разработчик игр, писатель.
Мой канал на YouTube
unity

- 11 проектов в портфолио
- Гарантия трудоустройства
- Поддержка менторов
Р7500
7500
В месяц