MrBeard

На Пикабу
Дата рождения: 01 января
787 рейтинг 5 подписчиков 10 подписок 9 постов 0 в горячем
Награды:
10 лет на Пикабу

Аналитика в геймдеве

Друг делает диплом по созданию игры наподобие марио. Попросил помочь с главой о аналитике в гейм деве. Написанную мной главу почему то решил в диплом не вставлять=( Ниже сама глава


В тёмные времена первобытных компьютерных игр разработчики никак не могли повлиять на свой продукт после издания и все их силы были направлены на создание идеально сбалансированного, интересного и нового для игроков продукта, ведь права на ошибку у них не было. Но то было давно и лишь самые старые игродевы помнят о тех временах.

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


Вы спросите, что же позволило так стремительно менять игровой процесс, выбивая из игроков всё больше и больше денег? Ответ прост - АНАЛИТИКА!


Как много в слове этом - “аналитика”. Это именно тот набор инструментов, который позволяет отслеживать все действия игрока с момента установки вашей игры. Игрок получил уровень? Мы будем знать. Игрок сжульничал и получил предмет раньше, чем мы задумывали? Мы будем знать. Игрок выработал тактику безболезненного прохождения нашей игры без доната? Мы будем знать и прекратим это!


Современный мир сервисов, предназначенных для аналитики, широк и разнообразен, но мы, будучи истинно белыми рыцарями без изъяна и упрёка, создадим свою систему!


Опишем же игровые события, которые нам хотелось бы знать и анализировать.

Установка

Старт уровня

Окончание уровня

Смерть персонажа

Список не так уж и велик, дык и игра не Bioshock.


С каждым событием мы будем отправлять уникальный идентификатор игрока, полученный на основе идентификатора его устройства, смешанного с тёмной магией. Ну, и версию игры мы тоже будем отправлять каждый раз. В событиях “Старт уровня”, “Окончание уровня” и “смерть” мы будем отправлять:


Количество жизней персонажа

Количество монет

Текущий уровень

Времени со старта уровня

Селфи игрока на момент создания события

С событием “смерть” мы так же будем отправлять идентификатор причины сего события(черепашка съела, звездой пришибло, проверил глубину пропасти)



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


Вы спросите, как же мы будем находить проблемные места в игре? Да очень просто. К примеру, мы берём последнюю версию игры и строим график количества пользователей от игрового уровня. Нормальное распределение пользователей для подобного графика плавное, без скачков, с постепенным снижением количества пользователей от уровня. Но на нашем графике мы наблюдаем Скачкообразное(от Скачков) изменение в районе уровня 5,когда его заканчивают лишь 10% от игроков, которые до него дошли.


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

Аналитика в геймдеве Gamedev, Аналитика, Тег, Длиннопост
Показать полностью 1

Первая игра на Unity3d или как я не потратил зря отпуск

Выдался у меня в этом году небольшой отпуск. И решил сей отпуск я потратить на создание маленькой мобильной игры. В качестве движка я выбрал Unity3d, с которым уже давно хотел плотно познакомиться.

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

С результатом моей работы можно ознакомиться здесь - https://play.google.com/store/apps/details?id=com.MrBeard.Fl... . Если будут желающие - позже сделаю версию под win или linux.


А теперь о самой игре и том, как она работает.

Начал я с поиска подходящей графики для игры. После долгих поисков решил остановиться на Kenney Assets pack - http://kenney.nl/assets .

Первая игра на Unity3d или как я не потратил зря отпуск Unity3D, Gamedev, 2D, Программирование, Длиннопост

Далее я перенёс интересующие ассеты в проект юнити и начал создавать игровую сцену. Она состоит из нескольких слоёв - задники, игровые объекты(игрок, враги, монеты), передний план UI. Механика схемы следующая - самолёт игрока висит на одном месте по оси Х, перемещаясь по Y, а все прочие объекты движутся справа налево с разной скоростью(которая зависит от Z координаты), создавая ощущение движения самолёта игрока и разного расстояния для различных фоновых объектов.


Для задников создано два генерящих скрипта(один для объектов типа облачков и башенок с деревьями, другой для нижнего уровня задника(облачка внизу или земля, которые идут сплошным потоком). Третий скрипт передвигает объекты каждый кадр на длину, зависящую от Z. В скриптах задаётся частота создания объектов и наборы объектов для генерации( несколько разных облачков, несколько деревьев и башенок, набор спрайтов для "земли")


Когда задники были готовы и радостно пролетали мимо меня в одном направлении (налево), я взялся за игровой самолёт и его управление. Изначально я сделал управление через две кнопки(вверх, вниз) и был вполне доволен результатом, но когда я сделал первый android билд и попробовал поиграть, то быстро пришёл к выводу, что две кнопки, как их не расположи, неудобно. Если их поставить друг над другом слева, игрок не сможет положить пальцы сразу на обе и ему придётся управлять одним пальцем, постоянно его перемещая, промахиваясь и ругаясь. Если расположить кнопки слева и справа внизу, то придётся отказаться от возможности выпускать вражеские самолёты с нижней позиции, ведь иначе игрок их просто не заметит за своим пальцем и, врезавшись в врага, попомнит меня добрым словом. В итоге я пришёл к управлению, напоминающему Flappy bird и retry. нажимаешь на экран - самолёт летит вверх, отпускаешь - начинает лететь вниз. 

Замечу, что от встроенной физики для игрового объекта я отказался, ускорения взлёта и падения, предельных скоростей - всё задано вручную и управляется скриптом через задание скорости объекта напрямую.


Генерация монеток в первой редакции была схожа с генерацией задников, но оказалась безумно скучной. Монетки генерировались на случайной величине Y и очень часто было невозможно достать две монетки подряд. Так что первым делом я переписал скрипт так, чтобы величина Y зависела от высоты предыдущей монетки. Их максимальное расстояние по высоте теперь такое же, какое может преодолеть игрок за то время, пока монетка пролетит расстояние, сгенерированное между этими монетками.

И вот монетки генерируются, их можно собирать, но это всё ещё скучно. Тогда я добавил различные наборы, в которых монетки расставлены определённым фигурным образом. Я не искал информации о том, как это лучше всего делать и придумал для себя два способа

1) Создать шаблоны в каком нибудь формате, где будет описана координатная сетка и расположение монеток относительно неё.

2) Создать объект-контейнер, в который будут помещены монетки, вручную расставленные в редакторе в нужном положении, после чего сохранить такой контейнер как префаб. Так я и сделал

Наборов получилось 7 штук. В генератор они добавлены с параметром веса, по которому и выбирается следующий набор. Если кто не знает, что такое "выбор по весам" - могу в комментах ответить)

Время добавить в игру врагов. В наборе спрайтов было 4 модельки самолёта, все разного цвета. Красный я решил использовать для игрока, остальные - для врагов. А для того, чтобы было не слишком скучно игроку и мне, врагов я сделал 3 типа(по количеству моделей у меня)

Первая игра на Unity3d или как я не потратил зря отпуск Unity3D, Gamedev, 2D, Программирование, Длиннопост

Зелёные - простой, стремительный. Летит по прямой, зато весьма резво.

Первая игра на Unity3d или как я не потратил зря отпуск Unity3D, Gamedev, 2D, Программирование, Длиннопост

Синие - Летят по параболе. Всегда начинают свой путь или с самого низа, или с самого верха.

Первая игра на Unity3d или как я не потратил зря отпуск Unity3D, Gamedev, 2D, Программирование, Длиннопост

Жёлтые - меняют свой курс, двигаясь к игроку. Приносят наибольший вклад в дело убиения игроков=)

Генератор случайным образом берёт префаб из набора врагов. Для увеличения сложности с каждым врагом уменьшается время между генерациями.


Это основная часть игры, сам геймплей. На его создание я потратил примерно два дня. Чем же я занимался оставшиеся 12 дней из двухнедельного отпуска? Учился создавать GUI, разбирался с Google developer console и плагинами для unity3d.

Дольше всего я пытался найти музыку для игры. Это, оказывается, безумно сложно сделать. Особенно в том случае, если не знаешь точно, что тебе нужно=). В итоге я нашёл короткую дорожку на http://www.playonloop.com/ . Советую сайт всем желающим)

Первая игра на Unity3d или как я не потратил зря отпуск Unity3D, Gamedev, 2D, Программирование, Длиннопост

Какие у меня были изначально планы? Я хотел создать 2 игры за 2 недели отпуска, изучить движок, а точнее его 2d составляющую. Получилось же лишь одна игра, да и та едва влезла в этот график. Жалею ли я о потраченном времени отпуска? Нет, было весело!

И это непередаваемое ощущение - залипать в собственную игру=)


Google play - https://play.google.com/store/apps/details?id=com.MrBeard.Fl...

Показать полностью 5

Первая игра на Unity3d или как я не потратил зря отпуск

Всё началось с того, что в этом году на работе заставили заранее выбрать даты отпуска и планово в него уйти. Моё обычное "а, потом отпуск, сейчас не до отдыха" в этом году не сработало. 

Моя работа связана с гейм девом, я пишу сервера для мобильных игр. А в отпуске человеку положено заниматься чем? Правильно, отдыхом от работы. Именно поэтому я занялся написанием простенькой мобильной игры на Unity3d=) Это была далеко не первая попытка познакомиться с этим движком, зато первая попытка, доведённая до финального результата.


Fly - финальный результат моих двухнедельных трудов.


А теперь немного о процессе разработки, моих ожиданиях и том, как оно получилось.

Первая игра на Unity3d или как я не потратил зря отпуск Программирование, Gamedev, Unity3D, Самолет, Длиннопост

Идея игры - два друга отправляются в полёт на воздушном шаре, в процессе которого уворачиваются от различных препятствий или врагов и собирают некие "бонусы" (звёздочки, монетки). Управление - дирижабль может передвигаться по вертикали вверх/вниз.


Начать в этот раз я решил с поиска графики, хотя бы немного удовлетворяющей игровой идее и остановился на kenney game assets. Дирижабля там не было, зато был неплохой набор спрайтов для игры "tappy plane", который я и использовал.


Теперь немного о внутренней логике приложения. Единственным объектом, который не перемещается по оси Х будет наш главный самолёт. Все прочие объекты проносятся мимо него. Задники - генерящиеся объекты(облачка, башенки, деревья, земля), скорость которых зависит от Z координаты, что позволяет создать эффект параллакса(или лично мне так кажется). Монеты и вражеские самолёты тоже генерируются, но несколько хитрее. О них ниже.

Простое распределение на игровом поле монеток случайным образом выглядит и скучно, и раздражающе, ведь очень часто они располагаются так, что физически невозможно собрать две подряд. Так что первым делом я написал генерацию новых монеток, зависящую от скорости движения монеток и максимальной вертикальной скорости игрового самолёта, теперь игрок всегда сможет преодолеть расстояние между двумя соседними монетами. Далее стал вопрос генерации не отдельных монет, а каких нибудь наборов (линия, треугольник, дуга из монет). Для этого я придумал два варианта создания таких наборов

1. создание шаблонов-матриц в текстовом виде, где каждый символ матрицы обозначает или монету, или пустое поле

OOOXOOO

OOXXXOO

OXXXXXO

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

Первая игра на Unity3d или как я не потратил зря отпуск Программирование, Gamedev, Unity3D, Самолет, Длиннопост

Я выбрал второй вариант, ибо счёл его более простым и быстрым для данной задачи.

В итоге у меня получился генератор монет, который имел набор префабов, каждому из которых был задан его вес. При удалении последнего сгенерированного контейнера монет на Random.Range(0.8f, 1.2f) * DefaultDistance от правого края экрана за экраном генерировался новый набор в соответствии с вероятностью его веса.

Теперь о вражеских самолётах. Их три типа. 

Первая игра на Unity3d или как я не потратил зря отпуск Программирование, Gamedev, Unity3D, Самолет, Длиннопост

Простой - быстро проносится по прямой.

Первая игра на Unity3d или как я не потратил зря отпуск Программирование, Gamedev, Unity3D, Самолет, Длиннопост

Шальной - имеет меньшую скорость движения, зато летит по параболе, чем зачастую удивляет игрока.

Первая игра на Unity3d или как я не потратил зря отпуск Программирование, Gamedev, Unity3D, Самолет, Длиннопост

Жёлтый - преследует игрока, меняя свою траекторию.


Как это работает? Простой тип не вызывает вопросов. Есть начальная скорость и небольшое ускорение по оси X, которое он получает каждый FixedUpdate. Шальной задаётся начальной скоростью и ускорением из диапазона (диапазон подобран вручную) по оси Y. Жёлтый ... Для жёлтого я задал Vector2 с ускорениями (к примеру 1f, 1f) и каждый гарантированный кадр он получает ускорение, равное произведению заданного вектора на вектор нормали к игроку.

Система генерации врагов случайным образом выбирает префаб с врагом, уменьшая время между врагами после каждого нового призыва(но до определённого предела)


Создав весь этот бедлам, я попробовал сделать первый android билд и с огорчением отметил, что система управления из первоначальной идеи смотрится на мобильных телефонах не очень. Две кнопки можно было бы расположить слева друг над другом, но тогда игрок будет вынужден нажимать на них одним пальцем, постоянно перемещая его по экрану, двигая и ошибаясь. Можно было их расположить внизу справа и слева, но тогда правая кнопка закрывала бы часть экрана, где могли бы появляться противники. Разбираться с виртуальным джойстиком я был морально не готов и пришлось реализовать однокнопочное управление, где при нажатии в любой части экрана самолёт начинал двигаться вверх, а без нажатия летел бы самостоятельно вниз. Благодаря этому управлению мне не избежать обоснованных и праведных сравнений с tappy bird и retry от Rovio. 


Это, в общем то, основная часть игры, написанная и протестированная за 2 дня. Чем же я занимался всё остальное время? А тем, что совершенно не умею делать - UI, интеграцией с Google Play, созданием проекта в Google Developer Console. 

Но больше всего времени у меня занял поиск музыки... Я около трёх дней провёл, прослушивая различные треки и слабо представляя, что в действительности хочу услышать. Совершенно не представляю, как пишут задания для композиторов на музыку... В итоге музыка была найдена на сайте PlayOnLoop. Там действительно неплохая подборка зацикленной фоновой музыки.

Первая игра на Unity3d или как я не потратил зря отпуск Программирование, Gamedev, Unity3D, Самолет, Длиннопост

Какие у меня были изначально планы? Я хотел создать 2 игры за 2 недели отпуска, изучить движок, а точнее его 2d составляющую. Получилось же лишь одна игра, да и та едва влезла в этот график. Жалею ли я о потраченном времени отпуска? Нет, было весело! 

И это непередаваемое ощущение - залипать в собственную игру=)

Google play - Fly

Показать полностью 6

Жалобы - это инфекция

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

Пожалуй, я откажусь от их услуг

Пожалуй, я откажусь от их услуг

Лучший coub прошлой недели

Лучший coub прошлой недели

Евровидение

Почему вокруг этого спорного конкурса столько шума? Неужели он кому то вообще интересен?

Паблик евромайдана поражает честностью

Они даже не пытались подобрать фотографии со схожим почерком...
Паблик евромайдана поражает честностью Они даже не пытались подобрать фотографии со схожим почерком...
Отличная работа, все прочитано!