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


    Под конец весны 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к голосов, ждём.

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

    Подробнее
    Реклама
    Комментарии 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
                                Почитав статью, понял — я не такой уж и плохой программист.
                                Бывают и хуже.

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