История подпольной игровой студии - 2
Продолжение поста История подпольной игровой студии, где я описал, как из большой и великой идеи получился маленький пшик.
Через полгода, оказалось, что это не совсем пшик, так как, ко мне обратились люди из какого-то чешского издателя и попросили продать игру. В ответ, я запросил много денег за то, что приносит 0 прибыли. Результат был предсказуем.
Где-то на год я сосредоточился на карьере на основной работе, и на личных приключениях, пока снова не стало стыдно за бездарно потраченное время. И тут мне попалась реклама курсов на Udemy. Я купил несколько курсов по Unity и это стало ключевым моментом. Мне повезло, тем, что попались курсы, которые подготовил Ben Tristem.
Фишка в том, что курс состоял из огромного количества лекций, в которых, простым языком и очень последовательно, разбиралась масса не очень очевидных игровых моментов.
Например:
- Как наличие минимальной гравитации в арканоидах позволяет избегать бесконечного зацикливания.
- Зачем надо добавлять небольшие рандомные искажения углов отскока
- Как эффективно использовать Scriptable Objects
- Как использовать Singleton и Don’tDestroyOnLoad
- На каком этапе игры надо экспериментировать с настройками физики
- Почему использование корутин в игровой разработке это хорошая практика, в отличие от обычной разработки
и много чего другого, сейчас и не вспомню.
И на этот раз, посмотрев штук 200 видео-уроков и, пользуясь знаниями, я смог написать довольно большой по объёму код, который можно было поддерживать. В течение полугода разработки я ни разу не столкнулся с ситуацией, когда не смог бы расширить решение, хотя сложно бывало, да.
Суммарно я наверное прошел разных курсов по юнити штук 10. Что ещё могу сказать, никогда не берите курсы, которые называются Authorized <что-то там> course. Как правило, их записывают чуваки, которые были в команде какой-нибудь суперуспешной гиперказуалки. Эти курсы такие же бодрые и бессмысленные, как и работа их авторов. Впрочем, если вы любите, чтобы вам пересказали своими словами, под мотивирующую музыку, help Unity, то можете попробовать.
И конечно, вам надо знать английский. Качественных курсов на русском почти не существуют. Хотя, я взял пару курсов Сакутина по спецэффектам и паттернам проектирования. Остальные русскоязычные авторы, на тот, момент, показались мне какими-то фриками.
При этом не нужно быть программистом, Tristem описывает так, что простой код можно писать сразу, дальше если вы никогда его не писали. Фактически, пример проекта с Top-Down Space Shooter из курса, вдохновил меня на создание следующего проекта SpacePort. Игра создавалась не на продажу, а, скорее, чтобы проверить насколько я могу:
1. Оперировать большим количеством объектов
2. Поддерживать код с большим количеством разных сцен
3. Оперировать объектами движущимися по сложным двумерным траекториям
4. Поддерживать сохранение и восстановления большого количества объектов
Выглядит это вот так:
Итак, с чем я столкнулся во время разработки и что понял для себя:
Сразу скажу, профессионалы это знают сразу, поэтому им это будет не интересно, а вот новички могут долго искать ответ на такие вопросы:
1. С тем, что нельзя просто взять сцену и сохранить на диск. Таких возможностей просто не существует. MonoBehavior объекты не поддерживают сериализацию и это очень правильно. Дело в том, что игровой объект может содержать на себе кучу компонентов, которые могут являться трехмерными объектами и весить много мегабайт. В итоге один такой сейв может весить больше игры. Поэтому мы прописываем несколько классов, которые будут сериализоваться на диск, а в основном скрипте мы ссылаемся из них на префабы объектов.
2. Из-за ошибки в архитектуре мне пришлось делать апгрейды пушек в реал-тайм режиме. Это значит, что если я сохранился, и у меня было несколько пушек с апгрейдами, то сначала загружается уровень с базовыми пушками, а затем им делается апгрейд через 20 миллисекунд. Это удобно делать при помощи корутин. Такие ошибки в архитектуре у любителей встречаются часто. Хотя у профессионалов тоже встречаются ещё и не такие ошибки, просто им обычно не с руки признать неправоту. Так что не надо сразу загоняться.
3. Проблемы с тем, чтобы сориентировать двухмерный объект в 2D игре в направлении цели при помощи LookAt(). Я прочитал кучу форумов и как и советовали, написал свой обработчик. Потом понял, что работа LookAt() зависит не только от оси вращения. Так же важно, чтобы в нулевом состоянии объекта он смотрел вправо.
4. Всякие гугловские библиотеки по сбору метрик и интеграции с Firebase лучше не совмещать с другой разработкой. Велика вероятность, что эту гадость придется убирать из приложения и лучше просто откатиться на пару коммитов назад. В любом случае, если вы такое делаете, постарайтесь проверить все функции такой сторонней библиотеки, а также залейте билд на все свои платформы и погоняйте его там. Проблемы могут быть совершенно разные, начиная с невозможности собрать сборку по неустановленной причине и кончая необъяснимыми крэшами на конечных устройствах. Особенно, если вы компилируете свой продукт используя IL2CPP.
5. Компиляция через IL2CPP, очень сильно улучшает производительность игры. Прямо вот в разы.
6. Многие начинающие девелоперы боятся слова оптимизация производительности. В итоге получаются простенькие гиперказуалки, которые могут испарить ваш телефон. Однако, это не так страшно. Возьмем, например Unity 2017 Game Optimization. Большинство советов оттуда можно имплементировать за полчаса. Например:
a. удалите все пустые Start() и Update() процедуры в игровых объектах. Процедура Update() вызывается каждый фрейм и если у вас много снарядов с такой пустой процедурой, то каждый фрейм вы делаете десятки или сотни пустых запусков.
b. Вместо вызовов GetComponent<Class>() используйте прямой доступ к компонентам
c. Старайтесь не использовать Vector4.Distance, Vector3.Distance, Vector2.Distance. Лучше сравнивать между собой квадраты расстоняний, чем сами расстояния.
И так далее. Я за 2 дня пробежался по книжке, ещё 2 дня у меня ушло на имплементацию простых техник. В итоге, код стал работать даже на утюгах. Единственное, что быстрый успех сильно пьянит и с оптимизацией, главное, вовремя остановиться.
Из нетехнических проблем сложным было
1. Сделать прогресс уровней. Так как игра уникальная, то не получится подсмотреть какой-нибудь Tower Defence или, ещё хуже, Веселую ферму и сделать “Как у них”. Пришлось всё придумывать из головы. Это помимо того, что надо тестировать большое количество вариантов постройки базы. Сначала это интересная работа, но через 3 дня подряд хочется кого-нибудь убить. Поэтому я постоянно делал паузы, в которые либо не делал ничего, либо писал технический кусок кода, а потом возвращался к проектированию уровней. Когда часто отвлекаешься от проектирования, то мозг иногда выдает оригинальные варианты.
2. Сделать сценарий. Я пытался написать его сам, но получился такой бред, что некоторые американские пользователи интересовались, что я курил. В следующей своей игре я уже сотрудничал со сценаристом, хотя это тоже тот ещё трэш.
3. Объяснить пользователю, что есть что. Потому что, никто даже половину фич игры не использовал, судя по тому, что я видел во время бета-тестов.
4. Подобрать музыку. Обычно я беру её на Premium Bit. Проблема в том, что сразу нельзя понять вписывается она в игру или нет. Через пару дней только осознаешь, что выбрал какое-то шило, хотя раньше трек казался идеальным. Поэтому, сейчас, я выбираю музыку на протяжении всей разработки, а не в самом конце. Когда хочу отдохнуть от сложных задач, то иду выбирать трек. Ставлю в игру, потом удаляю. И так, постепенно, прихожу к нужному результату.
Работал над игрой я вместе с дизайнером, Егором. Он подключился ко мне, ещё когда я делал Ninja Turf и так и остался. Во многом, только благодаря его работе и идеям Space Port получился играбельным. Не знаю, что его держит рядом со мной уже столько времени. Я думаю, что он надеется найти наконец стартап, в котором разбогатеет. А из всех стартаперов-неудачников, которых он знает, я наверное, самый упорный(ну или упоротый).
В чём я убедился ещё, запуская Space Port, так это в том, что все эти игровые каталоги приносят 0 трафика. 50-200 долларов лучше потратить тупо на рекламу в фейсбуке.
Вот пока ссылка на Space Port в Google Play:
https://play.google.com/store/apps/details?id=com.Spectre17....
игра полгостью бесплатная и без рекламы
P.S. А в следующем посте, я, наконец, подойду к UFO Stalker, которую я буду релизить в стиме в сентябре и она уже собрала немало вишлистов и установок демы. А так же всё-таки расскажу про командную работу.