Пролог
В начале 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. Если вы готовы потратить своё время и нервы на это, то вам стоит попробовать. Главное — идите до конца, не останавливайтесь на полпути, не пугайтесь трудностей и ошибок, ведь они бывают у всех, и зачастую их можно разрешить, приложив небольшие усилия.
Эпилог
В заключение хочу сказать, что создавать игры — это уникальный опыт. Я всегда хотел заниматься чем-то подобным. И работать над созданием игры мне было интересно на протяжении всего процесса. Конечно, поиск и исправление ошибок оставили свой негативный отпечаток, но это неотъемлемая часть создания чего-то нового. Не бойтесь попытаться сделать что-то своё, будь то приложение или игра. Даже если у вас не получится — у вас останется бесценный полученный опыт. И, возможно, в следующий раз вы сделаете что-то лучше, интереснее, качественнее. Рим строился не за один день. Ведь не попробовав — не узнаешь, твоё это или нет. Желаю всем удачи в ваших проектах, коммерческих успехов и покорения топов! Спасибо за ваше время.
Комментарии (24)
erlioniel
07.10.2015 13:38+1Спасибо за годную статью о подводных камнях, думал прочту очередной беклог как тяжело игры делать, а тут все предметно.
zalexander
07.10.2015 14:07+3Всегда пожалуйста. Сильно опасался недовольства публики, так как пишу в первый раз и не был уверен в том, на сколько будет интересно читать и как такую отсебятину воспримут.
Voley
07.10.2015 14:28+2>Пришлось откатываться до старой версии билда, благо, горькие ошибки в прошлом заставили меня научиться делать бекап перед каждым таким опасным изменением в проекте.
Я бы советовал начать пользоваться гитом, это просто, но нервов бережет много. Откаты на любую версию кода в любой день разработки — волшебно.zalexander
07.10.2015 14:40Знаю, пытался себя заставить взять и настроить все, но все никак не доходило. Следующий проект обязательно буду писать с использование Гита.
vitaly_KF
09.10.2015 08:55Обязательно беритесь за Git. Без него сейчас никуда. Тем более что там всё элементарно.
Если вкратце, то:
1. Создайте приватный репозиторий на bitbucket;
2. Скачайте TortoiseGit, на первое время будет в самый раз;
3. Склонируйте пустой репозиторий;
4. Инициализируйте проект.
Encircled
07.10.2015 14:56+2Вот и у меня вечная проблема с дизайнерами. Сейчас вот пробую свою девушку (художницу) отправить на курсы 3д графики :)
InstaRobot
07.10.2015 23:41Я не до конца разобрался в работе тестовых аккаунтов, что стоило мне двух списанных со счета долларов.
— Вы говорите про песочницу? Вы не могли потерять пару долларов, так как пока покупку не заапрувили, ничего не сработает, кроме песочницы. Там и надпись есть (Sandbx). И еще, даже для песочницы специально настраиваются тестовые аккаунты.zalexander
08.10.2015 07:33Я потерял пару долларов на том, что зашёл непосредственно на телефоне в тестовый аккаунт и пытался его активировать. Этого делать не надо. В таком случае требуют проверку кредитной карты, и сделать аккаунт не в своём регионе вроде не выйдет. А для подтверждения кредитной карты эпл списывает доллар со счёта. Плюс, если так войти в тестовый аккаунт, то он становится непригодным для теста в песочнице, вроде. Я не знал, что можно не активировать аккаунт и пользоваться им в песочнице, поэтому запорол два тестовых, полностью их активировав и введя данные карточки.
InstaRobot
08.10.2015 10:25Поздравляю с завершением проекта. На самом деле, у сторов все прозрачно, если изначально тратить время на изучение документации. На Хабре есть ряд материалов в помощь разработчикам. В любом случае, Вы получили бесценный опыт
zalexander
08.10.2015 10:52Спасибо! Это правда, я узнал очень многое о создании игр под андроид и iOS, о всяких нюансах, связанных с магазинами. Конечно, многих проблем можно было бы избежать, будь у меня кто-то знакомый, кто этим уже занимался, или если бы я работал на фирму, которая выпускает мобильные игры и сталкивалась уже со всем этим. А так, мне пришлось со всем разбираться самому, что с одной стороны хорошо для опыта, с другой — создание игры немного затянулось…
На самом деле, у сторов все прозрачно, если изначально тратить время на изучение документации.
Да, но ее сильно много, и не всегда знаешь, что именно тебе надо искать. А от большого количества текста документации, еще и на английском, у меня мозг начинает плавится…
На Хабре есть ряд материалов в помощь разработчикам.
Я активно пользовался статьями с Хабра при создании игры, и многие из них мне помогли в выборе, или с решением проблем, или просто ценным советом. Поэтому я решил отплатить Хабру, написав эту статью для таких же новичков, которым нужна помощь.InstaRobot
08.10.2015 12:32Да, но ее сильно много, и не всегда знаешь, что именно тебе надо искать. А от большого количества текста документации, еще и на английском, у меня мозг начинает плавится…
Ну, без английского, разработчику никуда не пробиться.zalexander
08.10.2015 12:55Проблема не в незнании языка, а в количестве теrста, который необходимо прочитать и усвоить. С языком проблем я не испытываю, зачастую ответы на мои вопросы нахожу на сайтах Unity3D forum или Unity3D answers или Stackoverflow, а так, без знания английского, действительно, никуда.
Я имел ввиду, что даже на русском от большого количества информации можно запутаться, а так, она еще и на английском, зачастую. Отсюда и проблемы, которых можно было бы избежать, прочитав и разъяснив все для себя, но чему помешала обычная человеческая лень.
Dalein
08.10.2015 19:28Если у вас не совсем древний комп, то вполне успешно можно поставить на винду виртуальную машину с OS X.
zalexander
09.10.2015 19:06Нет, спасибо. У меня рабочий ноут слабенький, а на домашнем компе мне не нужен Хакинтош, если вы его имеете ввиду. Слишком много мороки.
vitaly_KF
09.10.2015 08:56Дайте ссылку то на GPlay
zalexander
09.10.2015 09:31Я не знал, можно ли размещать, это же реклама своего рода. Вот ссылка на Google Play, кому интересно.
arielf
10.10.2015 00:53+1Ещё недавно, чтобы писать игры, нужно было знать C/C++, OpenGL и много математики — а сейчас достаточно C#, Java Script и Unity ;-)
zalexander
11.10.2015 19:17Таки да. Но, как по мне, это прогресс в лучшую сторону. Я всегда считал, что создавать игры это круто, но даже не думал, что когда то сам смогу этим заниматься. Но сейчас это стало возможным благодаря таким технологиям как Юнити. И, не зависимо от того, получится игра или нет, это стоит того, чтобы попробовать.
Necrozyablo
13.10.2015 13:17Ну это вы легко отделались. Года 2 назад плагинов пришлось использовать раза в 3 больше. В среднем в проекте около 20-40 плагинов из которых нативных шутк 10-15 точно есть.
по сабжу гугл плей в иос протащить не большая проблема и всё прекрасно билдится. (использовал как ваш плагин так и несколько других)
Но смысла в этом нет, все пишут решения которые на разных платформах юзают нативные «гейм\клауд центры». К слову офицальный гуглплейсервисы для юнити были не самые полноценный.(где то с год назад, может сейчас они таки допилили)
Создавать бейкапы перед обновлениями, ну это вы сами себе злобный буратино. Не использовать системы контролей версий, это как носить в штанах заряженный револьвер и надеятся что он не выстрелит.
Для инапов самое лучшее решение было unibill, а так 3 декабря будет версия 5.3 где они будут из коробки внутри юнити.
А вот Appodeal самое простое и стаб решение из того что есть. Во всяком случае после интеграции шутк 20 разных рекламных решений, остановились на нём. Хотя конечно и его jar'ы приходиться править.
Nolex
По идее, так и надо. Для iOS — GameCenter, а для Android — GPGS.
А в Android-версии GPGS все-таки остался? Какой плагин использовали?
А зачем бинарники? Сохраняете прогресс игрока?
deepnavy
https://github.com/playgameservices/play-games-plugin-for-unity#excluding-all-google-play-game-services-when-building-for-ios
В билде под ios можно убрать компиляцию плагина gpgs
zalexander
Знаю, так и хотел сделать, но для этого нужна последняя версия плагина (0.9.25), а, как я написал, у меня после ее добавления игра стала вылетать в сборке под андроид на моменте инициализации плагина. Поэтому пришлось возвращаться на старую версию (0.9.21), а в ней нет NO_GPGS. Поэтому пришлось в сборке под iOS плагин GPGS полностью выкинуть из проекта.
zalexander
Да, остался. Использовался официальный плагин для Unity.
Имелся ввиду ipa файл. Просто он так назывался при добавлении в iTunes Connect, так я его тут так и назвал бинарным файлом.