Кастомные редакторы для Unity3D, которые мы используем в игре

Unity - сказочный движок. Иногда эта сказка добрая, про пони и радугу. А иногда - про страшного бабайку. И очень важная часть данного движка, а именно расширения для редактора (custom inspectors) - как раз про бабайку. В статье я бы хотел поделиться опытом использования собственных расширений на примере нашей игры.

Кастомные редакторы для Unity3D, которые мы используем в игре Steam, Инди, Ранний доступ, Длиннопост, Unity, Gamedev, Разработка игр, Unity3D, Гифка
Некоторые из наиболее интересных наших расширений. Сколько на экран влезло...

Начнем с теории. Вот, что говорится в документации про расширения:

“Unity позволяет вам расширить редактор своими собственными инспекторами и окнами редактора (Editor Windows), и вы можете задать, как свойства должны отображаться и инспектора при помощи пользовательского Property Drawers.” https://docs.unity3d.com/Manual/ExtendingTheEditor.html


То есть имеем три основных типа для расширения функционала, наследуемые от базовых классов:

* UnityEditor.Editor

* UnityEditor.EditorWindow

* UnityEditor.PropertyDrawer


И сразу же первая загвоздка - все расширения делаются только с помощью кода. Никакого визуального программирования и блок-схем, WYSIWYG, перетаскивания кнопочек по формочкам. Только C#, только хардор. Изменил размер кнопки - будь добр пересобрать весь проект, чтобы увидеть изменения. Соответственно, написать новое расширение или поправить скаченное из Asset Store не программисту - практически непосильная задача.


Первый тип (Editor) используется для того, чтобы сказать Unity “как отобразить класс”. Это может быть ScriptableObject или MonoBehaviour. Используется чаще всего, по крайне мере у нас. Второй (EditorWindow) - может быть использован для отображения почти любого содержимого в пределах нового окна, за которое он отвечает. Третий (PropertyDrawer) отвечает на вопрос “как отобразить параметр”. Причем это может быть как один из стандартных типов параметров, так и свой собственный.

Кастомные редакторы для Unity3D, которые мы используем в игре Steam, Инди, Ранний доступ, Длиннопост, Unity, Gamedev, Разработка игр, Unity3D, Гифка
Пример кастомного окна редактора из документации https://docs.unity3d.com/Manual/editor-EditorWindows.html

Для каждого из типов расширений можно найти по небольшому “Hello World” в документации. Но чтобы сделать действительно полезное, удобное и красивое расширение, придется еще потрахпостараться. Связано это, во-первых, с наличием ОГРОМНОГО числа недокументированных и внутренних (Internal) функций движка, которые можно использовать. Во-вторых, с большим количеством багов и общей отбитостью не интуитивностью подсистемы. В-третьих, почти все статьи про расширения на английском или вообще иероглифы. Если с английским лично я еще могу справится, то китайский поддается только гугл транслейту, что слабо помогает общему усвоению информации. Именно поэтому сделать что-то сложнее двух дополнительных кнопок - сродни алхимии и черной магии. Но когда это нас останавливало?


В нашей, казалось бы, небольшой игре используется 22 собственных скрипта для расширений на ~2 500 строк кода в сумме. Приведу особо интересные примеры для каждого типа расширений.


PropertyDrawer


Здесь, как раз, ничего сильно интересного у нас нет. Просто для примера - отображение свойства неактивным, если объект на сцене. И возможность редактировать свойство, если объект является префабом.


Эта функция используется для свойств-идентификаторов объектов. Что-то типа ИД, необходимого для сериализации/десериализации структуры уровня. Защита от самого себя, чтобы не поменять идентификатор во время сборки уровня в редакторе. Если так сделать - уровень сохранится, но загружаться не будет.

Кастомные редакторы для Unity3D, которые мы используем в игре Steam, Инди, Ранний доступ, Длиннопост, Unity, Gamedev, Разработка игр, Unity3D, Гифка

Еще есть PropertyDrawer для класса “Координаты X и Y” - вместо двух строчек выводит в одну. Еще один - для отображения коллекции string в виде выпадающего списка.

Кастомные редакторы для Unity3D, которые мы используем в игре Steam, Инди, Ранний доступ, Длиннопост, Unity, Gamedev, Разработка игр, Unity3D, Гифка

EditorWindow


Здесь уже интереснее. Кастомное окно у нас - одно. Используется, как основной способ редактирования уровня. Весь код я приводить, конечно, не буду. Из интересного можно выделить пару моментов.


Первый - получение картинки-превью префаба. Т.е. той картинки, которая отображается в самом редакторе Unity. Реализуется с помощью одного метода AssetPreview.GetAssetPreview(gameObject) и возвращает объект Texture2D, который может быть использован в качестве контента для GUILayout.Button.

Второй - центрирование камеры в SceneView к выбранной ячейке.

Кастомные редакторы для Unity3D, которые мы используем в игре Steam, Инди, Ранний доступ, Длиннопост, Unity, Gamedev, Разработка игр, Unity3D, Гифка

Editor


Здесь начинается самое интересное. Во первых, был реализован универсальный базовый кастомный эдитор, который выводит в начало своей верстки короткое информационное сообщение. Это может быть просто текст подсказки, предупреждение или сообщение об ошибке. В зависимости от типа сообщения, блок с текстом отображается индивидуально. Визуально выглядит так:

Кастомные редакторы для Unity3D, которые мы используем в игре Steam, Инди, Ранний доступ, Длиннопост, Unity, Gamedev, Разработка игр, Unity3D, Гифка

Дальше от него наследуются все остальные кастомные эдиторы. Самые “толстые” у нас - это ContentPackEditor, LevelEditor, LocalizationEditor, GameFieldEditor. Каждый от 200 до 300 строк кода. Опять же, приводить код каждого смысла не имеет. Расскажу только про интересные моменты.


Для ContentPackEditor нужен был функционал визуальной сортировки элементов массива. И такой функционал в Unity есть, это ReorderableList в UnityEditorInternal. Вот статья по основам использования http://va.lent.in/unity-make-your-lists-functional-with-reor...


От себя я добавил сворачивание/разворачивание списка при клике на заголовок.

Кастомные редакторы для Unity3D, которые мы используем в игре Steam, Инди, Ранний доступ, Длиннопост, Unity, Gamedev, Разработка игр, Unity3D, Гифка

В LocalizationEditor надо было сделать что-то вроде таблицы, чтобы четные и нечетные сроки выводились разным цветом.


Вторым проблемным моментом было сделать поиск в уже добавленных ключах локализации и мгновенный вывод результатов в виде выпадающего списка под строкой поиска. Вот для этого найти решение было действительно непросто. В итоге нашелся метод на каком-то китайском сайте с иероглифами. Хорошо, что код - он и в африке китае код. http://www.clonefactor.com/wordpress/public/1769/


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

Кастомные редакторы для Unity3D, которые мы используем в игре Steam, Инди, Ранний доступ, Длиннопост, Unity, Gamedev, Разработка игр, Unity3D, Гифка

Собственно на этом все. В качестве вывода могу сказать, что расширения для редактора Unity - это очень и очень мощная штука. Пользоваться ей стоит однозначно. Правда перед этим нужно запастись терпением и навыком гуглить информацию на иностранных языках. Ах да, еще желательно руки и мозг - но, говорят, можно и без этого.

Почитать статью без всяких гифочек, зато с тру-кодом на C# можно на форуме: http://www.cyberforum.ru/unity/thread2191585.html


Страница игры в Steam : http://store.steampowered.com/app/766740/Maze_Of_Adventures/

ВКонтакте : https://vk.com/ocponl

Youtube : https://www.youtube.com/channel/UCc8LO3KVcEPNalUZJBB-4nw

Сайт : http://www.ocp.onl


Подписывайтесь, комментируйте, покупайте игру))

Лига Разработчиков Видеоигр

6.6K постов22.1K подписчиков

Добавить пост

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

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

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

2
Автор поста оценил этот комментарий

Почему то мне показалось, что вам нужно попробовать game maker. )) Ну или play maker(вроде так) для юнити на нодах.

раскрыть ветку
1
Автор поста оценил этот комментарий
Рокетная наука какаято
Автор поста оценил этот комментарий

@ImAlexSmith, доброго времени суток.
Хотел бы поинтересоваться у Вас как у человека, который работает на юнити.

Сложно ли Влиться в разработку игры по типу Undertale"а или Oneshot"а (имеется ввиду механика,графика, физика) в unity в бесплатной версии?

Базовые знания яп есть, думал начать учить js и к нему фреймворки( что бы игра могла быть мультиПлатформенная, в вебе и с возможностью порта на телефоны),но с юнити я вообще никогда не знакомился, может стоит?
Хотелось бы максимально безопасный и быстрый путь, так как если делать на js + фреймворки, библиотеки и движки(phaser.io/pixijs/etc) то это выльется в кучу, кучу времени, которое нужно будет еще потратить на перевод документации перед чтением.

раскрыть ветку
Автор поста оценил этот комментарий

//Соответственно, написать новое расширение или поправить скаченное из Asset Store не программисту - практически непосильная задача.
Так в этом и красота. Юнити поддерживает принцип "не знаешь - не лезь". Лучше попросить программиста, чем потом случайно обнаружить, что кто-то что-то не так поправил в проекте и почему-то все сломалось :)

Автор поста оценил этот комментарий

а на страничке в Стиме у вас куча фэйковых обзоров!! вашу игру гарантированно забанят, к сожалению. читайте вот мою статью об этом: https://pikabu.ru/story/zabanennaya_za_fyeykovyie_obzoryi_igra_vernulas_v_steam_5802280