4 августа 2013 в 22:04

История запуска игры в социальных сетях


Под конец весны 2013 года, я описывал историю плохого старта на Google Play. Пока с iOS заминки, решили закинуть игру в ВК и ОК. В статье я хочу поделиться особенностями запуска приложения под соц-сети, и расскажу про возникшие проблемы до и после релиза.

Особенности веб-плеерной версии



На этой платформе появилась возможность включить динамические тени, а не просто «бездушный» Projector, увеличить четкость текстур, а также улучшить глобальные параметры качества. Если для Android стояло «Fast», то тут можно было смело выбирать “Good”.

Еще нам понадобился футер для игры. В нем обычно размещают полезную информацию, кнопку приглашения друзей и ссылку на группу. Решил не морочится с Unity3d и сделал его прямо в HTML:


Подготовка серверной части


В веб-версии встал вопрос о надежном сохранении карьеры, рейтингов и платежей. Без этого приложение было бы неполноценным. Я смотрел в сторону знакомой мне связки PHP+MYSQL, которую я уже немного знал. Издатель негативно отнесся к этому решению (советовали перейти PostgreSQL), но я не послушал и делал по своему, так как мне было так проще.

Структура БД, тут хранятся все нужные данные



Основной файлик server.php вышел в ~300 строк, в нем описаны следующие возможности:
  • Регистрация игрока
  • Покупка и прокачка машинки
  • Покупка бензина (расходник)
  • Запись результата заезда

На этот файл игрок шлёт данные через POST и мы их пишем в БД. Не очень безопасно, но есть несколько простых проверок типа подписи через md5, которые защищают от школьников.

Ответ приходит примерно в таком виде:
{"id":"4","name":"Nolex","lvl":"7","coins":"9034","stamina":"40000","kill_zombies":"6952"}

Это JSON, для Unity3d советую использовать библиотеку JsonFx.Json.

Рейтинг – важный элемент игры, постоянно наблюдаю как игроки соревнуются там между собой, потому упомяну про скрипт rating.php. В нем было 8 запросов к БД, 4 из которых позже стали меня беспокоить.

SET @rownum:=0;
SELECT r2.`rank`, r2.`name`, r2.`points` FROM (SELECT @rownum:=@rownum+1 as rank, `salto` as `points`, `name`, `id` FROM `players` as `r1` WHERE `sn` = '1' ORDER BY `salto` DESC) as `r2` WHERE `id` = '999'

Это один из проблемных запросов определения позиции текущего игрока в выбранной категории. Когда игроков было мало, то это проходило моментально, но позже игроков стало больше, все стало тормозить и я убрал эту опцию. Сейчас, если игрок не попал в ТОП-100, то снизу просто отображаем его место как “> 100” и рядом заработанные очки. Иного решения я не смог придумать.

Позже, после релиза, появилась еще админка для игры, где я реализовал сводку последних данных, раздел статистики по всем соц-сетям, и рассылку оповещений с логированием в БД.

Баланс


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

После того, как я внедрил расходник, началось самое мучительное и одновременно интересное — настройка цифр. Издатель (Herocraft) настаивал на жестком балансе, а я напротив — более мягкий. Разговоры и споры ни к чему хорошему не привели и мы решили довериться тестам.

Для этого я настроил полное логирование всех заездов. Тестеры покатались и появились данные, благодаря которым мы смогли узнать сколько в среднем игрок зарабатывает монет и сколько тратит бензина на каждом уровне. Далее мы просто урезали топливо под каждый уровень. Нужно было добиться того, чтоб уровень «сходу» не проходился, а игрока стопорило ближе к концу трассы. Это не касается первого уровня, который предназначен для завлечения игрока. Это важно.

Окно с предупреждением о малом кол-ве топлива



Интеграция в соц-сети


Сначала интегрировал в ВК, было легко, т-к уже не первый раз. От API мне нужно было немногое:
  • Получение персональных данных игрока
  • Приглашение друзей
  • Постинг на стену
  • Спам (рассылка)
  • Запись уровня игрока в базу соц-сети (друзям видно активность игроков при «апах»)
  • Оплата (наверное, самый ответственный пункт!)

Далее приступил к ОК, тут все сложнее. API не привычное, песочница неудобная, но быстро привыкаешь. Для запуска, нужно юридическое лицо (вот тут плюс издателя). Из особенностей в ОК можно выделить квадратную иконку (с острыми краями), название игры на русском языке в обязательном порядке и придирчивую модерацию (где-то с 5-го раза получилось ёё пройти).

Запуск игры


Статические файлы были загружены в облако к издателю (там файлик *.unity3d размером в 22 Мб, и несколько картинок). PHP+MYSQL разместил на своем слабенькой сервере, которым арендуем с напарником за 40$ / мес. Посчитав, что все в порядке, приступили к запуску.

В ВК произошло все очень быстро, нажали на кнопку проверки (процедура бесплатная, в залог берут 10 голосов). В тот же день приложение одобрили и оно попало в блок «Новые». Пошел первый траффик.


Сервер себя вел нормально, но не так хорошо, как хотелось. Запросы шли довольно медленно, иногда были задержки по 3 секунды, потому я напросился к своему знакомому, у которого был неплохой тарифный план на Хецнере.
Игра в топе продержалась около недели, с каждым днем она падала все ниже и ниже. В день было по 5-7к установок, потом упало до 2к.

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

Далее намечался запуск в ОК. Релиз нам назначили на 27 число, но по непонятной причине игра релизнулась и попала в «Новые» 24 июля и вот тогда серверу стало плохо от наплыва большого количества людей.

Скачек обращений к MySQL-базе



Таким образом нагнулся сервер моего товарища, на что он мне сказал «большое спасибо» (к слову, на сервере был 1 крупный проект, приносящий деньги). Появились тормоза и иногда выбивала ошибка «502 Bad Gateway». Такая ситуация была около суток.

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

Всем игрокам которые играли в эти дни и сталкивались с «лагами» я накинул по 1000 монеток и сделал рассылку. Это хорошая практика в подобных ситуациях.

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

График регистраций в игре, тут видно примерно сколько трафа с ВК и ОК



Примерно такая же ситуация и по платежам, в ОК их больше, из чего можно сделать вывод, что там траф «пожирнее».

Немного цифр и заключение


  • Школьники нашли дырку в обучении. Можно было фармить по 10 монеток. Как говорит MySQL, один очень настойчивый мальчик проделал такую операцию 1200 раз и нафармил 12к монет.
  • На текущий момент игру установили уже более 130к человек (50% ВК / 50 ОК %).
  • Только 17% игроков дошло до последних уровней.
  • На днях в ВК отправили заявку в новые (уже платную), сняло 1к голосов, ждём.

Если подвести итог, то можно смело говорить, что нету большого смысла издавать подобную игру в соц-сетях, тут был больше спортивный интерес. В любом случае, было довольно занимательно наблюдать и влиять на весь этот процесс.
Алексей @Nolex
карма
11,0
рейтинг 0,0
Самое читаемое Разработка

Комментарии (29)

  • +13
    Далее мы просто урезали топливо под каждый уровень. Нужно было добиться того, чтоб уровень «сходу» не проходился, а игрока стопорило ближе к концу трассы.

    Лол, жлобы. С таким говно-подходом конечно никто в такое играть не будет. Особенно когда есть бесплатный «Word of Tanks».

    Лично бы выматерился и отправил разработчику лучей поноса.

    Как показывает опыт myspace вся такая «монетизация по-русски» к добру не приводит.
    • +3
      Не стоит сравнивать подобные сингл-плеер игры с WOT. Да и аудитория разная, посмотрите какого рода приложения в соц-сетях висят. Подход «жди или плати» довольно распространённый, его используют большинство фримиум игр (например, CSR Racing, Kings Bounty и т д). Я согласен, что схема не самая мягкая, мне более по душе монетизация как в Hill Climb Racing, но у нас изначально концепция не особо удачная, потому это единственный нормальный вариант в нашем случае. Отдавать игру «просто так» тоже не интересно.

      Лично бы выматерился и отправил разработчику лучей поноса.

      Ну, впёред! )
      • +2
        Серьезно, политика free2play в духе Аллодов — либо плати, либо бесплатная игра станет для тебя кошмаром.
        Гораздо приятнее просто покупка нового контента. Но понятно, что это сложно и долго. Не ваш случай.
    • +3
      100500 игр с такой системой монетизации висят в топах соц-сетей. Лично видел ежемесячные шестизначные цифры платежей по одной из них. Не думаю, что остальные сильно отстают. Уверен, что есть и опережающие. Вам не нравится != плохо.
  • +1
    120 запросов в секунду на выборку и сервер в хетзнере, что получше 40$ лег… Как же так вы смогли?:)

    Правки php-файлов по sftp вступают в силу только через несколько минут.
    opcode кешер?
  • 0
    в ОК каталог мощнее, на ВК катало можно использовать несколько раз + если игра хорошая — рекомендуемые — стабильный трафик на очень приличное время
    По вашему графику ВК не понятно — это какая стадия. Думаю если бы вы оплачивали «прибитие» в новинки на неделю за 5к голосов — трафика было бы больше, а у вас скорее всего отражено «мелькание» в новинках после прохождения модерации.

    Я правильно понимаю, что на сингловый проект без вирала на юнити в соцсети у вас был издатель? Странно, что его советы ограничились рекомендацией БД…
    • 0
      Платные новинки еще не видели, заказали как раз и сняло 1000 голосов. Через пару недель может появится в блоке.

      Да, издатель изначально был. Советов и помощи на самом деле было прилично. Для браузерной версии как минимум помогли с балансом, тестированием, сервером, заключением договоров с одноклассниками и всякими советами.
  • +5
    Если выкинуть неприятную любому нормальному человеку часть про «жлобскую аудиторию» и «выбор — ждать или донатить», то останется пиар и неприятная любому опытному админу/программеру часть про плохую оптимизацию работы с БД. Но при этом топик в хабах по геймдеву и Юнити, а не «Я Пиарюсь», потому эта часть тоже не шибко приятна.
    • 0
      Про аудиторию — это больше касамо ВКонтакте имеется в виду, так как платежеспособность ниже в несколько раз, чем в тех же Одноклассниках.
      Схема с энергией — нормальная практика, подождал пока накопилось, и играешь дальше.
      На счет плохой оптимизации возможно так и есть, хотя индексы назначены где надо. Тут скорее пробел был именно в настройке сервера, но это не моё.
      то останется пиар

      А пиарить тут нечего, уже давно отпиарено в упомянутых выше соц-сетях. Да и от этой платформы ничего не ждали, выпущено по моей инициативе ради опыта и обкатки перед iOS. Жаль, что вы для себя ничего не увидели интересного, но возможно кому-то наш опыт пригодиться.
      • +1
        А каким образом отсчитывали восстановление стамины, чтобы отослать сообщение? Какой то общий таймер дёргающий значение стамины и если > n, отсылали сообщение?
        • 0
          При рассылке примерно такой запрос подсчитывает восстановилось ли все топливо (за 120 секунд 100 едениц даём).

          SELECT `sid`, `spam_time` FROM `players` WHERE `sn` = 1 AND `stamina` < '20000' AND (UNIX_TIMESTAMP() - `stamina_time`) / 120 * 100 > '20000' - `stamina`
          
  • +2
    Господа, «присоединился», а не «присоеденился». (см. первый скриншот).
    • +1
      Ещё «всеравно».
  • 0
    А почему картинка на скрине выглядит такой мыльной?? Это она реально в игре такая? о_0
  • 0
    Вы кстати обещали рассказать, что в андроид версия заработала
  • +4
    А это не издевательство над игроками не давать возможности с первого раза пройти уровень насколько бы хорошо они не играли?
    • +3
      Уровень — да, издевательство, а вот не пройти всю игру с первого раза — нет, не вижу тут ничего криминального.

      При текущем балансе, если игрок прочитал подсказки и прошел урок, то пройдет сходу более половины игры, как минимум. На первой локации топлива вообще в 2 раза больше, чем нужно. Игра проходится без вложений легко.
  • 0
    Не очень понял как андроид версию интегрировали в соц. сети. Расскажите технические детали интеграции. Переписали игру чем-то?
    • 0
      Игра написана на Unity, так что проблем с переносом её между платформами быть никаких не должно.
      Хотите билдите под iOS, хотите, Andriod, Mac, Win и другие.
      Дополнительная работы только с интеграцией нативных библиотек под каждую платформу.
      • 0
        Это под платформу, а под веб, не очень понял как это происходило. Приложения вконтакте это флеш контейнер насколько я знаю, так в каком виде приложение туда собирается?
        • 0
          Под веб есть компиляция в Юнити, называется она — WebPlayer. Для проигрывания нужно ставить плагин. Встраивается через html. Возможности в несколько десятков раз круче, чем во Flash.

          unity3d.com/webplayer — тут подробнее.
  • 0
    Уточните — берут ли flash издатели игры написанные на Unity3D?
    И если делать на Unity3D игру — не будет ли потом проблемы найти издателя?
    Во flash издателей вроде как пруд-пруди.
    • 0
      Это уже зависит от издателя. Мой издатель работает с разными движками/платформами, хотя многие берут только Флеш.

      Вы главное, продукт хороший сделайте, издателя всегда найдёте.)
  • +1
    В общем, прикол. После этой статьи нашелся один засранец умелец и ломанул игру! Вытянул секретный ключ с клиента… Ну а зная его, можно формировать свои запросы и читерить. Таким образом у многих игроков появилось кучу денег и заоблачный рейтинг.

    image

    Сейчас более-менее восстановил БД и защитил получше. Теперь дополнительно подписываю юзеров при входе и проверяю стандартными средствами соц-сети через auth_key.

    Накрутить себе денег и очков, можно и сейчас, если немного знать cheat engine или декомпиляцию проектов, но только себе. К сожалению, не существует защиты, которая может полноценно защищать от накрутки, т-к в Юнити открытый код, и все можно прочитать.
    • 0
      От читеров-новичков и фанатов мемсёрчеров (Cheat Engine, ArtMoney и т.д.) поможет скрытие переменных в памяти, кстати я совсем недавно зарелизил в Asset Store для этих целей простенький тулкит (https://www.assetstore.unity3d.com/#/content/10395), возможно и вам пригодится.

      А от профи — да, не поможет ничего. В качестве простых мер — реализуйте на сервере проверки игрового процесса — проверяйте насколько адекватно игрок зарабатывает, чтобы сразу палить тех, кто читит по-крупному, тогда (если все сделать правильно), злоумышленнику придется писать бота для читинга — а это уже какая-никакая, но работа, не у всех будет желание и время этим заниматься.
      • 0
        За ссылку спасибо, хотя вполне возможно там реализация как в ProtectedInt32 / SecureInt. Из подобного находил недавно Secure PlayerPrefs, но то немного другое.

        Проверки сделаны. Эффективная защита на самом деле.
        • 0
          Да, в тулките есть средства для безопасного хранения переменных типа int, uint, string, float, а так же есть класс, который позволяет предотвратить читинг сейвов (по сути аналог Secure PlayerPrefs выходит), в планах — добавить что-нибудь для безопасного соединения с сервером (чтобы пакеты не перехватить было), в общем, в итоге должно получиться этакое все-в-одном для быстрого и простого внедрения защиты от читеров-новичков (от профи не спасет ничего). Если есть желание опробовать в своем проекте — пишите — я буду рад предоставить вам тулкит бесплатно!
  • 0
    image

    1 сентрября разместились платно в каталоге Контакта. Все-таки платное размещение более качественное, т-к игра дольше находится в топе. Траффика много, даже больше чем в Одноклассниках. Эффект интересный.
  • 0
    Почитав статью, понял — я не такой уж и плохой программист.
    Бывают и хуже.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.