[Из песочницы] Как без мата создать игру на Unity3D
Пролог
В начале 2015 года я решил написать свою первую игру. В качестве движка я, не долго думая, выбрал Unity3D, так как у меня был опыт в C# и JavaScript, и знакомые, которые могли помочь. Я вспомнил одну мини-игру, в которую я играл в детстве, и решил сделать нечто похожее. Установил себе Unity и поставил себе цель сделать рабочий прототип за пару недель, параллельно изучая движок.
Я начал реализовывать эту идею в свое свободное время. Через неделю был рабочий прототип, через полтора месяца у меня уже был работоспособная версия игры со всей прописанной логикой. Я удовлетворился этим и на время отложил игру на полочку. В июне я снова взялся за нее, с мыслями, что мне понадобится максимум месяц на то, чтобы ее доделать. Ох, как же я был не прав…
И так, с какими проблемами я столкнулся при создании своей первой игры на Unity3D?
- Дизайнеры
- Плагины
- Google Play
- App Store
Дизайнеры
Первая серьёзная проблема, с которой я столкнулся, было отсутствие дизайнера. И если на начальных этапах, когда я просто создавал прототип игры, это было еще не так важно, то чем ближе к завершению работы, тем большие неудобства я испытывал. Я начал искать дизайнера в июне, и мои поиски довольно быстро увенчались успехом. Я нашёл девушку, которая была не против помочь с рисунками. Мы встретились, оговорили, что необходимо сделать, и она пропала. Потом снова появилась, пообещала всё сделать, и снова пропала. Так прошел где-то месяц, прежде чем я понял, что свои рисунки я не получу. В итоге, весь UI игры мне пришлось рисовать самому, и у меня на это ушло не мало времени. Вскоре я договорился с одним своим хорошим знакомым, он согласился помочь, сказал, что недели за две справится. Я ему поверил — а что мне оставалось делать? К концу второй недели он мне радостно сообщил, что почти всё закончил, и дал посмотреть на свои рисунки. Там была половина от того, что мне нужно было, при чем часть надо было переделывать. На это у него ушло ещё две недели (в сумме там было десяток простеньких спрайтов). И то, пару спрайтов он так и не доделал и мне пришлось самому выкручиваться, вооружившись фотошопом.
Что я могу сказать в заключение этого пункта: всегда заранее договаривайтесь с дизайнером, если сами не умеете рисовать. Ищите ответственного человека, который всё будет делать вовремя, иначе у вас потом будет много мороки. Также это может создать никому не нужные задержки с релизом игры, когда с программной стороны всё уже будет готово, а дизайн ещё не завершен.
Плагины
Уже когда игра показалась мне завершенной, я решил заняться подключением сторонних плагинов. Сейчас в ней три плагина:
- Google Play Game Services (GPGS);
- Soomla;
- Appodeal.
Google Play Game Services
Плагин от Google был выбран для добавления в игру достижений и таблиц лидеров, так как из всех вариантов, которые я нашел, он был бесплатным, простым в использовании и поддерживал как Android, так и iOS. На момент его добавления, для меня он казался идеальным решением. После добавления плагина в проекте появилась новая проблема, которая будет подробнее описана ниже, а именно аккаунт разработчика Google Play. Без него у вас не будет ID достижений и таблиц результатов, и вы не сможете тестировать эти функции вашей игры. Но, когда у вас появляется доступ к ним, проблем с их настройкой возникнуть не должно. В интернете можно найти большое количество информации на эту тему.
К сожалению, у меня так и не получилось настроить работу GPGS плагина на iOS, все мои попытки приводили к ошибкам при сборке, и в итоге мне пришлось полностью выкинуть GPGS из билда на iOS. Но, в принципе, я ничего не потерял, так как Game Center прекрасно справляется с реализацией достижений и таблиц результатов, и для него не надо добавлять никаких сторонних плагинов — достаточно использовать класс Social, встроенный в Unity.
Soomla
Плагин от Soomla состоит из трёх отдельных библиотек:
- Soomla Core — основная библиотека, которая содержит общие функции и утилиты, необходимые для работы плагина;
- Soomla Profile — библиотека для интеграции с соц. сетями (Facebook, Twitter, Google+);
- Soomla Store — библиотека для внедрения системы покупок.
Изначально он планировался как плагин для работы с соц. сетями, так как самому создавать велосипед не хотелось. Но, в последствии, было решено добавить Soomla Store. Опять-таки, основными причинами выбора именно этого плагина были его бесплатность, простота в использовании, хорошая документация на сайте разработчиков и универсальность. Причём не только в том, что он работает как с Android, так и с iOS, но и в том, что он добавляет сразу две необходимые вещи — соцсети и встроенные покупки.Soomla Profile
Мне необходимо было добавить возможность делиться рекордами в соц. сетях, с чем плагин, после настройки в проекте, успешно справляется. Но для того, чтобы его настроить, придется попотеть. Для работы с твиттером достаточно создать связанное приложение, зайдя через свой аккаунт, и вбить в настройках Soomla в Unity полученные Consumer Key и Secret. Библиотека Twitter встроена в плагин. А вот с фейсбуком дела обстоят немного иначе. Необходимо создать связанное приложение в консоли разработчика Facebook, для него необходимо добавить информацию для каждой платформы, где собирается использоваться приложение. Добавить плагин Facebook в проект и в его настройках прописать полученный от фейсбука ID приложения. Также для андроида вам понадобится пакет OpenSSL для получения development and release key hashes. У меня были проблемы с получением ключей в Unity, но на странице настройки приложения описано как их получить через консоль.
Если вы всё сделаете правильно, то у вас все должно заработать. Soomla предоставляет большое количество event handler’ов, которыми я советую вам во всю пользоваться.
Soomla Store
Мне необходимо было добавить всего одну покупку в свою игру — отмену рекламы, так что я не смог по достоинству оценить все те возможности, что предоставляет эта библиотека, но она включает в себя всё, что может понадобиться при создании магазина внутриигровых покупок. Тут я лишь могу посоветовать не забывать проверять ваши встроенные покупки прежде, чем вы выложите свою игру в магазине. Android предоставляет возможность покупки тестового продукта, который имеет уникальный ID, в то время как Apple позволяет зайти в игру с помощью тестового аккаунта Sandbox и сделать тестовую покупку непосредственно вашего продукта. Не обошлось и без подводных камней. Так, моя первая попытка выложить игру в App Store провалилась. Как оказалось, для андроида плагин Soomla автоматически восстанавливает Non-Consumable покупку, если вы стёрли приложение, а потом снова его установили, тогда как Apple требует, чтобы внутри игры была кнопка восстановления покупки, и никак иначе. Сейчас игра висит на повторной проверке, и мне остается лишь надеяться, что всё пройдет успешно.Appodeal
Изначально я собирался использовать плагин Chartboost внутри своей игры, встроил его в проект, и он работал как надо. Но, вскоре, я узнал о существовании плагина от Appodeal, в который было встроено множество рекламных сетей, в том числе и Chartboost. И я решил попробовать его. Мне “повезло” — именно тогда был период его обновления, так что две недели я не мог проверить его работу, потому что не мог связать его со своей игрой. Но когда плагин обновился, не составило никакого труда настроить его под свои нужды и использовать его в проекте.
Единственное неудобство, вызванное обновлением, было в том, что мне пришлось создать аккаунт AdMob и привязать его к Appodeal, так как эти рекламные площадки работают в тесной связке. А для создания аккаунта AdMob необходимо создать аккаунты AdWords и AdSense, и привязать их к AdMob. Будьте готовы потратить на это какое-то время, так как придётся разобраться с регистрацией в этих сервисах.
Поиск неисправностей
Довольно частой проблемой при использовании нескольких плагинов являются дубликаты библиотек. Так как некоторые плагины требуют обязательного наличия определенной библиотеки, может стать так, что у вас с двух плагинов в проект добавится одна и та же библиотека. Это вызывает ошибку Unable to convert classes to dex format. Для исправления этой ошибки вам придётся перерыть весь проект в поисках дубликатов. Советую изначально смотреть, что именно вы добавляете в проект при импорте плагина. Это поможет избежать нежелательных дубликатов.
Другой проблемой являются остаточные файлы при обновлении плагина. Так, при обновлении структура плагина может измениться — одни классы заменят другие, либо же они будут располагаться в другом месте. Остаточные файлы будут вызывать конфликты, ошибки и лишнюю головную боль. Решение этой проблемы простое — полностью удалять файлы старого плагина, и уже тогда ставить новый.
Для меня так же очень докучающей стала проблема обновления плагинов. Например, после обновления плагина GPGS у меня перестала запускаться игра, что бы я с ней ни делал — вылетала при запуске, так как в этот момент идет инициализация плагина. Я потратил день на безуспешную борьбу с проблемой, а когда решил вернуть старую версию плагина, у меня стало выкидывать при закрытии окна таблиц рекордов. И, хоть я нашёл людей, столкнувшихся с той же проблемой, ни один из предложенных способов решения не помог мне. Пришлось откатываться до старой версии билда, благо, горькие ошибки в прошлом заставили меня научиться делать бекап перед каждым таким опасным изменением в проекте. Попытки обновить Soomla так же вышли мне боком — повыскакивали проблемы, которых до этого не было. Опять-таки, пришлось откатываться и использовать старые версии плагина. С обновлением Appodeal тоже было не все гладко — они добавили новые библиотеки и появилась ошибка Dex 65536.
В общем, совет вам: если плагин работает, вас устраивает его функционал и это не обязательное обновление, связанное с изменением API — не обновляйте его. Вы получите больше проблем, чем пользы. У меня сейчас в игре всё прекрасно работает со старыми плагинами GPGS и Soomla.
Что действительно необходимо обновлять постоянно, так это Android SDK. Вот тут я могу лишь посоветовать как можно чаще открывать SDK Manager и проверять на наличие новых обновлений. Без этого многое может перестать работать, а так как при работе с Unity не происходит автоматический поиск обновлений, как если бы вы работали с Android Studio, это надо делать вручную. За время, что я делал игру, у меня два раза игра ломалась из-за того, что были устаревшие версии библиотек, таких как Google Play Services. И каждый раз требовалось время на выявление причины ошибки.
А вообще, в поиске решения проблем мне всегда помогал Google. Так как с большинством проблем, с которыми вы можете столкнуться, уже кто-то сталкивался до вас. Главное набраться терпения и искать правильный ответ. Не опускайте руки и всё у вас получится. А кто говорил, что всё будет просто?
Это далеко не все ошибки, с которыми я столкнулся при добавлении плагинов в свою игру, но именно эти ошибки мне больше всего потрепали нервы. Надеюсь, мои советы помогут вам избежать их, либо упростят поиск причины.
Google Play
Для того, чтобы иметь возможность выложить игру в магазине Google Play, вам понадобится создать себе аккаунт разработчика Google Play и единоразово оплатить взнос в размере $25. Сразу после этого вы получаете доступ ко всем возможностям консоли разработчика приложений. Но чтобы получать деньги от Google, вам необходимо привязать свой банковский счёт. Это первая проблема, с которой я столкнулся при работе с Google Play, так как для перевода нужна карточка с IBAN номером, а такие имеет не каждый банк. Других способов вывода денег в Украине пока не предусмотренно. Причем, ни в банке, ни в поддержке Google нам так и не смогли чётко ответить, какую именно карточку нужно открывать. Пришлось самому разбираться, что да как.
Создание связанного приложения для GPGS не должно вызвать затруднений — тут всё интуитивно и понятно. Создаете достижение/таблицу рекордов, настраиваете, получаете ID и используете его в своём проекте. После успешной реализации можно протестировать работу достижений/таблиц рекордов, используя при входе свой тестовый аккаунт, при этом не забыв добавить этот самый аккаунт в список тестовых аккаунтов в консоли разработчика Google Play.
Но не смотря на мороку при создании аккаунта, работать с Google Play мне доставило куда больше удовольствия, чем с App Store. Игра на Google Play выкладывается в течении часа-двух, можно быстро и эффективно вносить изменения в игру. Про App Store я расскажу ниже.
App Store
Начну сразу со сравнения с Google Play. Цена за аккаунт разработчика в разы выше — $100 против $25, и это всего лишь доступ на год. Потом необходимо снова заплатить $100. Ожидать рассмотрения игры в среднем вы будете неделю, а потом вашу игру могут отклонить. И даже если вы исправите причину, по которой игра была отклонена, и снова отправите игру на рассмотрение, то далеко не факт, что ее не отклонят по другой причине. У Apple очень жесткие правила публикации приложений в их магазине. В связи с этим, выкладывание игры в магазин Apple может затянуться на недели. Тут остается лишь надеяться и ждать…
После мороки с Google Play, с созданием аккаунта разработчика Apple уже было меньше проблем. Проблемы пошли потом. Первой, и самой очевидной, была невозможность создать бинарный файл, не имея макбука. С этим я справился, благо, есть доступ к рабочему маку.
Второе: имея собранный в Unity проект, его необходимо открывать на маке в XCode и там уже настраивать и создавать бинарный файл. Я изначально работал под виндой, и когда пришло время переписывать игру под iOS, я просто собрал проект и скинул его на макбук, чтобы создать бинарник. После долгого процесса избавления от мелких ошибок и разбора, как всё устроенно в макинтоше, я столкнулся с проблемой при создании бинарника. Порывшись в интернете я узнал, что стоит собирать проект для iOS в Unity непосредственно на маке. Мне пришлось заново собирать проект, настраивать его в XCode и, о чудо, ошибка пропала.
Если вы всё же решили собирать Unity проект на винде, то не забудьте проверить, чтобы у вас был установлен на компьютере Python, iTunes и прописаны необходимые пути в переменной PATH.
Отдельным пунктом хочется выделить создание Сертификатов и Профайла. Без них у вас не получится выложить приложение в App Store. Также, для того, чтобы протестировать работу Game Center и внутриигровых покупок, вам придётся создать отдельный профайл, и специальный тестовый Apple ID для Sandbox. Я не до конца разобрался в работе тестовых аккаунтов, что стоило мне двух списанных со счета долларов. Мелочь, а не приятно. Как оказалось, необходимо выйти из своего аккаунта на тестируемом устройстве, зайти в игру и там уже зайти в тестовый аккаунт, предварительно добавленный в Sandbox, тогда можно будет протестировать работу вышеперечисленных сервисов.
Создание бинарного файла игры для iOS влечет за собой куда большие затраты времени и требует больших усилий, чем создание apk для андроида, но так вы можете получить доступ к обширной аудитории пользователей продукции Apple. Если вы готовы потратить своё время и нервы на это, то вам стоит попробовать. Главное — идите до конца, не останавливайтесь на полпути, не пугайтесь трудностей и ошибок, ведь они бывают у всех, и зачастую их можно разрешить, приложив небольшие усилия.
Эпилог
В заключение хочу сказать, что создавать игры — это уникальный опыт. Я всегда хотел заниматься чем-то подобным. И работать над созданием игры мне было интересно на протяжении всего процесса. Конечно, поиск и исправление ошибок оставили свой негативный отпечаток, но это неотъемлемая часть создания чего-то нового. Не бойтесь попытаться сделать что-то своё, будь то приложение или игра. Даже если у вас не получится — у вас останется бесценный полученный опыт. И, возможно, в следующий раз вы сделаете что-то лучше, интереснее, качественнее. Рим строился не за один день. Ведь не попробовав — не узнаешь, твоё это или нет. Желаю всем удачи в ваших проектах, коммерческих успехов и покорения топов! Спасибо за ваше время.