[Из песочницы] Как я решил уйти в геймдев

Это история о том, как я бросил все и начал делать игры.Шаг нулевой — решениеПочти десять лет я занимался электронным документооборотом. Наверное, если бы мне кто-нибудь десять лет назад сказал, что я в этом настолько серьезно увязну — не поверил бы. Тем не менее, хоть предметная область и не менялась, довольно долгое время мне все это было интересно. Интересно было создавать службу поддержки вместо повинности программистов дежурить по очереди, интересно было создавать всероссийское (ух, слово-то какое пафосное) сообщество разработчиков, интересно было встречаться с сотнями неглупых людей из десятков ведущих российских компаний, от производителей бургеров до строителей АЭС. Постоянно искать хитрые решения нестандартных запросов. На этом месте часто пишут «и вот в один прекрасный день я понял…», но, на самом деле, такого дня не было.Постепенно я осознал, что дожил до должности «гуру, сидящего в углу». В компании даже сочинили шутливый аттестационный вопрос новичкам после испытательного срока — чем же я на самом деле занимаюсь. Потому что никто толком не знал. А заниматься я стал в итоге преимущественно экспертной деятельностью. Согласовывал спецификации, советовал как по крупному построить архитектуру, во сколько обойдется проект и у кого есть компетенции на его выполнение. И обучал остальных новым технологиям, которые частенько доставались на пробу именно мне. А как хобби — совал свой нос во все дела, где требовались мозги, от архитектурных хаков до стратегического планирования компании. В общем, сидит в углу такой бородатый дядька, по должности программист, по грейду как начальник отдела, код не пишет, чего делает — неясно. И периодически порывается кого-нибудь воспитывать или читать лекции по истории США, Китая или Древнего Рима. Ну и еще с ним выгодно иметь хорошие отношения, потому что ему обычно ужасно скучно, и он всегда рад помочь чего-нибудь придумать.В общем, тепло, светло, мухи не кусают. Зарплату платят по провинциальным меркам хорошую. Свободного времени сколько хочешь, мало кто может нагрузить тебя кучей глупой работы, ведь никто не знает — насколько и чем ты занят. Да и как-то не принято гуру отправлять траншеи копать. А то вдруг появится работа, которую могу сделать только я, а я как раз копаю? Но умной работы было маловато. Для кого-то такая позиция идеальна, но для меня скука смертная. И со временем скука эта привела к тому, что от предметной области стало основательно подташнивать. А значит, отпал и вариант уходить совсем уж в менеджеры. Сложно быть мастером сапожников, когда тебя мутит от одного вида сапог.

И я решил переучиваться. Начал с того, что прошел начальный курс по Java на Интуите, и никуда я из мира большого корпоративного ПО уходить не собирался, но тут мне случайно на глаза попалась Unity. Я подумал — эге, вот это крутая штука. Пишешь код один раз, в элементарном предметно-ориентированном инструменте, и получаешь порт на все платформы? Пусть далекий от оптимального, но все равно это фантастика же!

Я всегда хотел создавать игры. Наверное, с тех самых пор, как лет эдак в 10 научился рисовать круги и линии на экране ZX Spectrum. Это было невероятное ощущение. Думаю, примерно так же чувствует себя карапуз, когда понимает, для чего нужен фломастер. И начинает увлеченно рисовать каляки-маляки на всем, что подвернется под руку. Свои маляки из геометрических фигур на бейсике я мог писать днями. А первую законченную игру написал где-то лет в 15. Это был пошаговый Пакман. В отличие от классического Пакмана, в моем геймплей был основан не на скорости, а на логике. Некоторые монстры были с абсолютным самонаведением на игрока, распространявшимся на всю карту, поэтому маршрут надо было тщательно планировать. До эры смартфонных казуалок тогда было еще лет 10, и у игр, которые может сделать обычный, далекий от гениальности (или маниакальной работоспособности) школьник, не было ни спроса, ни средств распространения. Поэтому в школьные годы все писалось для себя.

И вот, посмотрев на Unity, я решил тряхнуть стариной. Уж очень меня эмоционально зацепила простота и кроссплатформенность. Радость от успешного запуска первой элементарной сцены на андроиде была сопоставима, пожалуй, с радостью рисования первого круга на Spectrum.

Решив, что быть инди — это все же слишком, я начал искать компании, в которых я мог бы поработать. Беглый поиск вакансий показал, что, в принципе, работа для юнитистов есть. Мало, конечно. И даже из этого небольшого списка, часть относится не к играм, а к какому-нибудь моделированию тракторов для стендов сельхозвыставок. Но в целом, найти с кем поработать вполне реально.

Рассылать резюме совсем без игростройного опыта не хотелось. Подозреваю, конечно, что мое резюме и так привлекло бы внимание. Не думаю, что так уж много людей уходят от архитектуры корпоративных систем к веселой ферме на телефоне. Утрирую, конечно. Не знаю, впрочем, было бы такое внимание положительным или нет. Так или иначе, и для портфолио, и лично для себя, я решил что-нибудь написать. Не публиковать, но хотя бы разобраться в платформе, предоставить хоть какой-то рабочий пример своего кода, а не только рассказы о том, как мои космические корабли бороздят просторы Газпрома и всяких госорганов.

Шаг первый — игра Я решил написать что-нибудь простое, что я смогу осилить в одиночку, и в то же время, во что мне самому интересно было бы играть. В платформеры я не играл с детства, а головоломки вообще не люблю. Кроме того, относительно недавно с удовольствием прошел первый Plants VS Zombies и второй Fieldrunners. И решил не мудрствовать и сделать что-нибудь вроде Tower Defence. Хотя и моветон уже, я знаю.Копировать геймплей вышеупомянутых игр не хотелось. В этом, конечно, нет ничего плохого, большинство отличных игр являются развитием чужих идей. Но меня обуяла жажда творчества и желание придумать что-нибудь оригинальное. Поэтому я решил, что вместо башен у меня будут неуправляемые войска, которые сами будут решать как им сражаться. Наверное, в жанр TD это уже не очень вписывается, ну да ладно, подумал я. В конце концов, люди играют в игры, а не в жанры (хотя выбирают по жанрам, признаю). А в качестве места действия пусть будет Англо-Зулусская война. Потому что первая запомнившаяся мне игра с принципом «управляй элитными войсками против слабого, но очень многочисленного противника» была Zulu Wars еще на Spectrum.

Т.к. я искал самых простых решений, то решил не эмулировать трехмерный мир в 2D, а использовать все возможности движка для ускорения разработки. В конце концов, Unity предлагает мне и поиск пути, и расчет столкновений, и еще кучу всяких вкусностей, рассчитанных изначально на 3D.

Найдя пару бесплатных моделей с анимацией, я сделал бегающих друг за другом чуваков и запустил это все на Huawei MediaPad X1 (фаблет средней производительности, отстает от современных топов, но не в разы).

890a09091b974b388e8fd7f004fa448e.png

Результат в целом порадовал, чуваки бегали, анимация работала. Вот так это выглядело, розовая отладочная линия показывает ключевые точки найденного пути.

94680fc6ebe043a3afb9cf26bbbbab47.jpg

Но тут меня настигли первые проблемы. Оказалось, что мое тестовое устройство категорически не справляется с наличием более 20 подобных юнитов. С такой производительностью о массовых баталиях можно было забыть. Профайлер мне был недоступен, поэтому изучать причины тормозов пришлось методом исключения. В целом, я пришел к выводу, что самая проблемная часть это сами модели и анимация. По картинкам видно, что детализация этой пробной модели куда выше необходимой. Но даже заменив ее на гуманоидную модель палка-палка-огуречик, мне не удалось добиться нормальной работы более 30 юнитов. Вывод, который я сделал — или войск должно быть гораздо меньше, или надо уходить в 2D, чего мне не хотелось.

Значит, это не война, а некое небольшое сражение. Где каждый юнит на счету и каждый «герой». Тут я вспомнил «Семь самураев». Подходит практически идеально — защитников можно пересчитать по пальцам одной семипалой руки, уровни игры это дни битвы. В общем, могло получится довольно атмосферно. Попытавшись найти что-нибудь насчет прав, я смог найти разве что тот факт, что фильмы Куросавы так и не перешли до сих пор в общественное достояние. Поэтому на всякий случай, самураев я решил сделать 6. Прототип был вполне играбельным, но с одной проблемой я в итоге не справился — с рисованием анимированых гуманоидных моделей. Не то чтобы это была совсем не решаемая задача, но после недели копания, я понял, что прогресс меня не устраивает. Я разбирался в этом слишком медленно.

fc8d05162b454144b5a187332055dfa6.jpg

3df0a27e263c442da6dc697ac99fd514.png

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

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

Отказаться от самураев было морально тяжело, мне нравилась эта идея. Ее можно было сделать красиво и интересно. Но для первой игры начинающего разработчика на самоинвестировании это показалось немного слишком. Поэтому самураи переехали из средневековой японской деревни на… Марс. И превратились в марсиан, отбивающихся от земного вторжения.

В отличие от гуманоидов, техника с простейшей анимацией почти не вызывала проблем. Как с рисованием, так и с производительностью. Поэтому и разразилась страшная битва между НЛО и марсоходами.

625bed6b408843288532bbad0f916cb2.png

Только не бейте меня за желтую воду на Марсе. Я знаю, что это бред. Но она красивая и разбавляет однотонность пустыни. Это все земляне… хм… наделали.

От механики с шестью юнитами и портретами я отказываться не стал, она мне понравилась. Конечно, она потеряла свою изначальную осмысленность, но оказалась достаточно удобна и заслужила право на жизнь. Лечение за экраном превратилось в разборку на ресурсы, это добавило интерактивности.

В конце концов, из намерения сделать Tower Defence получилась… почти классическая RTS. Только бараков и озвучки «spawn more overlords» не хватает.

Над «марсианской версией» я начал работать с начала января. К концу января движок игры был сделан процентов на 95 и была пара уровней. Казалось бы, почти все готово — рисуй новые юниты, делай уровни. Но ведь не для этого я с работы ушел, правда? Надо же чтобы было не скучно. Поэтому каждый юнит и каждый уровень обязательно добавлял в игру новых фишек. Почти все, что приходило в голову, превращалось в код. К счастью, ничего совершенно безумного мне в голову не пришло. В итоге, состояние «почти готово» растянулось еще на 2 месяца работы практически без выходных. Но я думаю, что в данном случае такой подход себя скорее оправдал, чем нет. Если пишешь что-то, что не продумал изначально, а только воплощаешь свои фантазии, то уж изволь воплощать их все. Или хотя бы большинство. Иначе и результат, и процесс, может оказаться уныл. А если тебе интересно, то хотя бы от процесса ты всегда получишь удовольствие. Впрочем, большую часть этого времени заняли, конечно, не новые фишки, а рисование моделей и, кажущееся бесконечным, тестирование баланса каждого уровня. 3D-художника и тестировщика не хватало ужасно. Отчасти поэтому уровней всего 10. Больше просто не осилил.

Шаг второй — интеграция Конечно, у меня и в мыслях не было заработать на этой игре какие-то деньги. Но чтобы считать предприятие успешным, я решил, что надо вернуть хотя бы 124$ стоимости лицензий. Поэтому я решил не делать игру совершенно бесплатной, но выпустил две версии — бесплатную с рекламой и платную без. Такой вариант показался мне более заслуживающим доверия, чем встроенная покупка «отключить рекламу». В последнее время развелось столько фремиума, что почти все игры с описанием «бесплатно, содержит встроенные покупки» — это просто вымогательство. Бесплатностью там и не пахнет. Попасть в эту компанию не хотелось, поэтому никаких встроенных покупок.Но! Как быть игроку, когда он прошел половину игры, решил ее купить, а новое приложение заставляет его проходить все заново? По-моему, такое отношение к клиентам недопустимо. И ладно бы еще, если бы бесплатная игра была ограничена парой уровней, но она полностью функциональна. Можно пройти хоть до финала и только потом купить платную. А уровни по меркам современного казуального мира сложные, я сам до сих пор не могу пройти некоторые гарантированно с первого раза.

Чтобы не обижать покупателей, я решил найти способ, которым бесплатная игра могла бы сообщить платной о прогрессе игрока. После дня поиска, так ничего и не найдя, я понял, что придется изобретать.

Можно было бы использовать доступ к файловой системе и писать какой-нибудь свой файлик в общие папки вроде фоток и музыки, но это совсем не красивый подход. Вместо этого я решил попробовать использовать ачивки Game Center и Play Games. В обеих платформах можно создавать группы приложений, привязанных к одному и тому же набору ачивок. То, что надо — проходишь уровень, получаешь ачивку. И все связанные игры знают, что эта ачивка у тебя уже есть.

Дело за малым — написать. Google даже постарался и сделал плагин для Unity, позволяющий работать с Play Games, а поддержка Game Center уже давно встроена в сам движок. Обрадованный подобной удачей, я качаю плагин Google, подключаю, пишу код и… он не работает. Пишу немного другим способом и… снова не работает. Ачивки открываются, но получить список открытых ачивок при старте игры, нельзя. Метод есть, но не работает. Смотрю реализацию и вижу «not implemented yet» и возврат всегда пустого списка. Браво, Google. Неужели никому не надо получать список открытых ачивок? Это я один такой извращенец?

Покопавшись в коде плагина и чувствуя себя доктором Ником на операции, я выяснил, что плагин все же получает список ачивок, но он приватный.

3f746b03179442a499e02c87ce948c56.png

Плагин получает его только при логине в Play Games и не обновляет. Видимо, Google решили не светить такое наружу. Т.е. если я открою новую ачивку, то в списке она не появится до перезапуска. Ну и пусть, такой список меня вполне устроил. Ведь мне и надо проверять ачивки только при старте.

А вот с Game Center никаких проблем не возникло, в Unity все что надо оказалось реализовано и работоспособно.

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

Шаг третий — публикация К публикации я начал готовиться во второй половине февраля. Купил за 2 минуты лицензию разработчика Google, заказал лицензию Apple (знал бы я, во что это в итоге выльется, начинал бы в декабре). А вот покупать лицензию Microsoft не стал. Тут надо сказать, что для тестирования у меня были следующие аппараты — уже упоминавшийся Huawei MediaPad X1, iPhone 4s, iPad2, iPad Mini и Lumia 1020. И из всех только Nokia оказалась не пригодной для игры. В сценах, с которыми старенький iPhone 4s вполне справлялся, совсем не старенькая Люмия выдавала 2–3 fps. Это оказалось для меня абсолютным сюрпризом. Беглый поиск «в этих ваших интернетах» сообщил, что тесты производительности 3D даже для топовых Люмий показывают весьма посредственные результаты. Попытки покрутить качество отрисовки ситуацию принципиально не исправили. Огорчительно, но пришлось отказаться от релиза под Windows Phone.Итак, лицензия Apple. Вообще, за последние пару месяцев я понял одно — Apple, как компания, ненавидит своих разработчиков. Имею ввиду не сотрудников, а сторонних разработчиков софта. Не знаю как так получается, но каждый сотрудник Apple по отдельности вежлив, доброжелателен и весьма полезен. Но как компания… Может, кому-то такое мнение покажется слишком радикальным, оно сложилось из кучи мелочей. Чтобы что-то начать писать — покупай мак, чтобы протестировать что-то, что написал (даже в целях обучения) на своем же, уже купленном тобой устройстве — покупай годовую лицензию за 99$. Инфраструктура поддержки разработчика состоит из тучи интегрированных между собой сервисов, связь между которыми ломается. Одобрение приложения занимает 30 минут работы, но ждешь его 1,5 недели. Нервотрепки добавило и внезапное (для меня) правило обязательной нативной поддержки ARM64 для всех приложений, опубликованных после 1 февраля 2015. Представьте, если бы в Microsoft запретили всем разработчикам писать 32 битные приложения. Вот было бы весело.

Лицензию разработчика Apple я заказал 20 февраля, а получил 12 марта (сравните с двумя минутами от Google). И это заслуживает отдельной истории.

Почитав про старую практику отправки pdf-форм по факсу в США, ужаснувшись, представив будто Купертино захватили амиши и не дают никому пользоваться современными средствами связи, не одобренными дедушкой Линкольном, я заполнил форму заказа лицензии на сайте разработчиков (видимо, амишей все же недавно изгнали вместе с факсами). 99$, данные кредитки, ничего не предвещало беды. Отлично, сказал мне Apple, после обработки ваш заказ появится в Apple Store.

И действительно, через пару дней он появился. С ценой 99 рублей и сообщением об отклонении платежа, в котором мне рекомендовали связаться с банком.

de169eec79914b398004491f8c14fc05.png

Возможно, если бы банк был не ВТБ24, то на этом мои проблемы бы и закончились. Но судьба решила, что небольшие испытания мне, видимо, не повредят. Сам же хотел чтобы было не скучно. Съездив в ВТБ, и получив от них клятвенные уверения в том, что ничего они не отклоняли и ничего от Apple и вообще ни от кого не приходило, я решил позвонить в русскую поддержку Apple Store. Не то чтобы я всерьез надеялся на то, что они мне помогут, но был хотя бы минимальный шанс. К сожалению, русский Apple Store ничего об этом не знал, заказ мой не видел (поддержка Apple Store не видит мой заказ в Apple Store — ха!), но сотрудник поддержки очень хотел быть полезным и вызвался помочь мне в навигации по сайту чтобы я нашел форму обратной связи с европейской поддержкой разработчиков. По-моему, очень правильно с его стороны. Впрочем, эта форма у меня уже давно была открыта. Вспомнив свои жалкие познания в английской грамматике, я написал письмо примерно следующего краткого содержания — «Смотрите, у вас там 99 рублей, это очень мало. Наверное, это ошибка. И платеж не проходит, банк говорит, что не отклонял». Параллельно я заметил, что в профиле на сайте разработчиков у меня имя кириллицей, а фамилия латиницей. В теории меняться это должно через Apple ID, но поменяв там, я обнаружил, что интеграция у них не работает. Об этом тоже написал.

Удивительно, но ответ пришел в тот же день от товарища по имени Стефано. Настолько оперативной реакции я не ожидал. Он сообщил, что имя он мне починил, а с платежом все должно быть нормально, отклоняет именно банк. И что указанная цена тоже нормальная, потому что цена в разных странах может отличаться, налоги, локальные правила и бла-бла-бла. И что заказ будет висеть теперь неделю, за которую я могу разобраться с банком. А если не успею за неделю, то могу отправить другой заказ. Ну хорошо, думаю я, 99 рублей — отличная цена. Ну к чертям этот некомпетентный ВТБ, попробую через неделю другой банк. Но возможно, стоило все же дожать ВТБ.

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

Результат не заставил ждать — такое же отклонение платежа. Я написал Стефано, чтобы тот перепроверил все же, работает у них система платежей или нет. И особо отметил, что 99 рублей это 1,5$. Подобная гигантская скидка говорит об ошибке. А где одна ошибка, там и другая. Стефано ответил на следующий день. Он все проверил и опять отклоняет банк. Ну хорошо. Тогда я написал в поддержку Яндекс.Денег. Прождав ответа неделю, я позвонил им поругаться. В результате в течение дня пришел ответ, что платеж отклонен, потому что он на 99$, а у меня столько нет. Вот так новости.

Что ж, по крайней мере, ситуация прояснилась. После пополнения кошелька на нужную сумму, Apple все же получили мои деньги. Прислав в ответ сообщение «We are unable to activate your Apple Developer Program membership. We have received your purchase information and will email you shortly to verify additional details». И параллельно прекратив меня пускать на сайт по Apple ID. Только самый упорный получит лицензию. Я решил не отставать от Стефано, и поругал его слегка за то, что тот меня с самого начала дезинформировал, и 1,5$ — не нормальная цена, о чем я его неоднократно предупреждал. И на отказ в логине тоже пожаловался.

Правда, я никак не ожидал, что в ответ он мне позвонит и начнет что-то быстро объяснять на английском с испанским акцентом и со связью как будто с планетой Плюк. Он настолько застал меня врасплох, что единственное, что я смог ему ошарашенно ответить со своим русским акцентом, чтобы он прислал мне все почтой. И через минут 10 я получил письмо с извинениями и уверениями, что он все мне починил, все активировал, а информацию об ошибке в магазине передал начальству. А Apple ID просто так у всех сломался, мои беды тут не при чем, когда починят, он не знает, но вероятно скоро. Supervisor его мне потом тоже писал, объяснял что теперь у меня должно быть все хорошо, а если нет, чтобы я писал ему. Но я не писал, квест с лицензией был выполнен, а Apple ID действительно починили.

А дальше… создание 108 скриншотов (6 устройств * 6 языков * 3 скриншота) и тревожное ожидание одобрения приложения в течение 11 дней. Тревожное потому как проект, сгенерированный Unity для Xcode, выдавал мне 5–6 предупреждений на устаревшее API, которое использует Unity. Причем устарело оно аж в iOS 7, а Unity самый свежий. Если бы это вызвало проблемы при review, то на исправление ушли бы недели, ведь про Objective C я не знаю почти ничего. Но, к счастью, все прошло успешно.

Шаг четвертый — работа в геймдеве А вот тут пока пусто. За 3 месяца приключений, проблем с Apple, починке 2 глючных недописанных плагинов Google для Unity, в которых я понимал примерно столько же, сколько мартышка в очках, отсутствия дохода и постоянных трудностей, грозивших поставить крест если не на всей игре, то как минимум на весомой ее части или на публикации под одну из платформ, я довольно изрядно вымотался. Да и новых знаний пришлось проглотить столько же, сколько за последние года 3–4. Поэтому уезжаю в отпуск плавать в море и смотреть на рыбок. А потом найду себе работу.

© Habrahabr.ru