До релиза игры остался месяц, я решил переписать ее полностью...(

И у меня получилось!

Когда кнопки пропадают с экрана, отмазка "этонебагафича" перестает работать

На связи снова я со своим маленьким космо-шутером с видом сверху с честными орбитами, гравитацией и космодробовикам, имя которому HOTLOOP.

Прошлая моя статья была о тонкостях озвучки, а на этот раз я решил затронуть тему программной реализации, а именно внедрения контейнера зависимостей, его величества Zenject (т.к. игра на Unity)!

Его светейшество
Его светейшество

С самого начала разработки основное внимание уделялось только геймплейным механикам, чтоб кораблики летали, пушки стреляли, а гравитация работала как и в реальности. В итоге такой подход привел к тому, что во всей игре было только три уровня: Главное меню, летная школа и орбита планеты. Большего ведь для тестирования геймплея не нужно... И надо признаться они справлялись с задачей, к которой готовились, а именно к участию в фестивале демок в steam "Играм быть"!

Типичный замес на орбите

Фестиваль прошел, демка игры кое-как отработала, и принесла каких то вишлистов и теперь нужно было двигаться дальше. Но из-за того как именно был реализован весь проект, задача создания новых уровней из максимально приятного ctrl+c ctrl+v превращалась в ужаснейшую рутину по перепривязыванию одних объектов к другим.

Суть проблемы

Предположим есть у нас планетка, при посадке на которую должна происходить починка корабля игрока. Для этого в скрипте планеты наружу выведено поле для ввода, в котором можно указать корабль игрока в качестве целевого объекта для ремонта. Но что же произойдет если заменить планету на космическую станцию? А произойдет то, что корабль игрока придется привязывать заново. И пока таких объектов парочка на весь уровень - это не проблема, но если их десятки, это очень быстро начинает превращаться в дичайшую головную боль.

Надо подкачаться, надо надо подкачаться!

Для решения именно этой проблемы, умными дядьками была создана концепция автоматического "внедрения зависимостей". Специальный скрипт знает какой объект в сцене является кораблем игрока, и может передать ссылку на него любому другому нуждающемуся объекту. Таким образом, при замене планеты на станцию, больше нет необходимости указывать ей кто тут ̶п̶а̶п̶о̶ч̶к̶а̶ игрок!

Это я перекатываю проект на Zenject
Это я перекатываю проект на Zenject

Далее хочу привести несколько рекомендаций по разработке проекта с прицелом на внедрение zenject (и возможно аналогов тоже).

1 - Внедряй zenject сразу. Если тебе не хочется внедрять его сразу, то тебе кажется, и на самом деле тебе хочется внедрять его сразу!

Его преподобнейшество
Его преподобнейшество

2 - Если ты всетаки проигнорировал п.1, и теперь тебе, как и мне нужно перелопачивать почти весь проект, не спеши сразу все делать на живом проекте\в основной ветке разработки. Если используешь Git, сделай отдельную ветку и экспериментируй в ней. Если не используешь гит, то сделай бекап проекта в отдельной папке, чтоб у тебя всегда была возможность вернуться в точку, где zenject-а еще нет.

Описание
Описание

3 - Сведи использование UnityEvent и рефок на объекты в инспекторе (как на скрине ниже) к минимуму. В них ты будешь прокидывать связи на конкретные объекты, а это как раз случай с планетой, станцией и игроком, описанный мной выше! Это допустимо разве что только для ссылок на самого себя.

В этой картинке вся боль и все больно
В этой картинке вся боль и все больно

4 - Префабь все сверху до низу. В идеале (до которого даже я не дошел пока), вся иерархия сцены должна быть синей. Так ты избежишь ситуации, когда ты добавил пункт меню на одной сцене, но на другой локации в этом же меню этот пункт не появился.

Префабы всему - голова
Префабы всему - голова

5 - Уже в процессе перевода на зенжект, когда ты заменяешь UnityEvent на инъекцию через контейнер, тебе захочется скрыть эту этот ивент из инспектора, ведь он вроде как теперь бесполезен. НЕ ДЕЛАЙ ЭТОГО. Оставь пока не убедишься что на ВСЕХ сценах ты пересобрал логику из ивента с использованием контейнера!

Ато эти чуваки закажут тебе доставку ктулху на дом

6 - Так же если зенжект внедряется в уже полу-готовый проект, как в моем случае, ты наверняка узнаешь, что по канону, зенжект должен сам создавать объекты которые покрывают зависимости (в нашем случае это корабль игрока, который являлся зависимостью для планеты и станции), следовательно казалось бы, их можно удалять со сцены после описания инъекции. НЕ ДЕЛАЙ ЭТОГО... просто не делай. Иначе добавишь себе головную боль с порядком регистрации зависимостей. По феншую сделаешь уже на новом проекте!

До релиза игры остался месяц, я решил переписать ее полностью...(

Ну и по класике!

Поговаривают, что у добавивших мою игру в желаемое FPS во всех играх увеличивается на 10 единиц, а PP получает +1см к длине. Думаю тебе стоит проверить эту гипотезу!

2323
10 комментариев

Какой бодрящий заголовок

1
Ответить

ну не мы такие, жизнь такая)

Ответить

Я новичок в разработке и меня смутило это предложение: "Специальный скрипт знает какой объект в сцене является кораблем игрока, и может передать ссылку на него любому другому нуждающемуся объекту". Чем такое внедрение зависимостей отличается от какого - нибудь сервис локатора, который все называют анти паттерном? Знающие люди, объясните, пожалуйста

1
Ответить

Я думаю, что истинна в том, что просто не стоит вешать ярлыки на те или инные инструменты. Даже синглтон, который ялвяется общепризнанным антипаттерном иногда может быть полезным. Нужно просто понимать преимущества и недостатки каждого и использовать их с умом.

Ответить

Поиграл, и могу сказать что в целом задумка интересная, дочке понравилось )
Но есть два минуса:
1. Звук - через 15 мин голова начинает болеть.
2. Управление просто адское!

Успехов в релизе )

1
Ответить

Спасибо за отзыв! Да, с управлением пока не придумал что можно сделать без изменения концепци(

Ответить

До релиза игры остался месяцНе вижу релиза игры, хотя первое мая давно прошло.

1
Ответить