Сообщество - Unity

Unity

260 постов 2 713 подписчиков

Популярные теги в сообществе:

1

Как две минуты первой сессии предсказывают судьбу вашей игры (и 4 SQL-запроса для анализа)

Анализ первой сессии -- это "момент истины" для твоей игры.

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

Замылил картинку для интриги :D

Замылил картинку для интриги :D

Ниже я расскажу, как на основе длительности этого "свидания", можно давать оценку и строить гипотезы. А еще прикреплю SQL запросы и поделюсь аналитикой по своей веб-игре Ферма на острове (https://yandex.ru/games/app/336608).

Что показывает длительность первой игровой сессии

1. Эффективность онбординга

  • Короткая сессия (менее 3-5 минут) часто означает, что игрок "уперся в стену" -- не понял механики, запутался в интерфейсе или столкнулся с техническими проблемами

  • Оптимальная длительность (5-15 минут) говорит о плавном вхождении в игру

  • Длинная сессия (15+ минут) — игрок "зацепился", он получил достаточно мотивации продолжать

2. Прогноз долгосрочного удержания

По моим данным (я их округлил для наглядности), игроки с первой сессией:

  • Менее 2 минут — 80% никогда не возвращаются

  • 5-10 минут — 45% возвращаются на следующий день

  • 15+ минут — 65% играют через 7 дней

3. Качество маркетингового трафика

Разная длительность сессии по источникам:

  • Рекламные сети — часто короткие сессии, если реклама не соответствует геймплею

  • Рекомендации друзей — более длинные сессии, так как есть социальное доверие

  • Органический поиск — самые вовлеченные пользователи

Сбор данных и SQL запросы

Данные я собираю в Unity Analytics.

Анализ длительности первой сессии за последние 90 дней

WITH first_sessions AS (

SELECT

USER_ID,

EVENT_JSON:sessionID::STRING as session_id,

MIN(EVENT_TIMESTAMP) as first_session_start

FROM EVENTS

WHERE EVENT_JSON:eventName::STRING = 'newPlayer'

GROUP BY USER_ID, EVENT_JSON:sessionID::STRING

),

session_durations AS (

SELECT

fs.USER_ID,

fs.session_id,

fs.first_session_start,

MIN(e.EVENT_TIMESTAMP) as session_start,

MAX(e.EVENT_TIMESTAMP) as session_end,

DATEDIFF(second, MIN(e.EVENT_TIMESTAMP), MAX(e.EVENT_TIMESTAMP)) as duration_seconds

FROM first_sessions fs

JOIN EVENTS e ON fs.USER_ID = e.USER_ID

AND fs.session_id = e.EVENT_JSON:sessionID::STRING

WHERE e.EVENT_DATE > CURRENT_DATE-90

GROUP BY fs.USER_ID, fs.session_id, fs.first_session_start

),

percentiles AS (

SELECT

APPROX_PERCENTILE(duration_seconds, 0.1) as p10_seconds,

APPROX_PERCENTILE(duration_seconds, 0.5) as p50_seconds,

APPROX_PERCENTILE(duration_seconds, 0.9) as p90_seconds,

AVG(duration_seconds) as avg_duration_seconds,

COUNT(*) as total_sessions

FROM session_durations

WHERE duration_seconds >= 0 -- исключаем отрицательные значения

)

SELECT

ROUND(p10_seconds, 2) as p10_duration_seconds,

ROUND(p50_seconds, 2) as median_duration_seconds,

ROUND(p90_seconds, 2) as p90_duration_seconds,

ROUND(avg_duration_seconds, 2) as average_duration_seconds,

total_sessions

FROM percentiles;

Анализ длительности первой сессий по платформам за последние 90 дней

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

WITH first_sessions AS (

SELECT

USER_ID,

EVENT_JSON:sessionID::STRING as session_id,

MIN(EVENT_TIMESTAMP) as first_session_start,

EVENT_JSON:platform::STRING as platform

FROM EVENTS

WHERE EVENT_JSON:eventName::STRING = 'newPlayer'

GROUP BY USER_ID, EVENT_JSON:sessionID::STRING, EVENT_JSON:platform::STRING

),

session_durations AS (

SELECT

fs.USER_ID,

fs.session_id,

fs.platform,

fs.first_session_start,

MIN(e.EVENT_TIMESTAMP) as session_start,

MAX(e.EVENT_TIMESTAMP) as session_end,

DATEDIFF(second, MIN(e.EVENT_TIMESTAMP), MAX(e.EVENT_TIMESTAMP)) as duration_seconds

FROM first_sessions fs

JOIN EVENTS e ON fs.USER_ID = e.USER_ID

AND fs.session_id = e.EVENT_JSON:sessionID::STRING

WHERE e.EVENT_DATE > CURRENT_DATE-90

AND fs.platform IS NOT NULL

GROUP BY fs.USER_ID, fs.session_id, fs.platform, fs.first_session_start

)

SELECT

COALESCE(platform, 'Не указана') as platform,

ROUND(APPROX_PERCENTILE(duration_seconds, 0.1), 2) as p10_duration_seconds,

ROUND(APPROX_PERCENTILE(duration_seconds, 0.5), 2) as median_duration_seconds,

ROUND(APPROX_PERCENTILE(duration_seconds, 0.9), 2) as p90_duration_seconds,

ROUND(AVG(duration_seconds), 2) as average_duration_seconds,

COUNT(*) as total_sessions

FROM session_durations

GROUP BY platform

ORDER BY total_sessions DESC;

Анализ длительности первой сессии понедельно за последние три квартала

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

WITH first_sessions AS (

SELECT

USER_ID,

EVENT_JSON:sessionID::STRING as session_id,

MIN(EVENT_TIMESTAMP) as first_session_start,

EVENT_JSON:platform::STRING as platform,

YEAR(EVENT_TIMESTAMP) as session_year,

WEEK(EVENT_TIMESTAMP) as session_week

FROM EVENTS

WHERE EVENT_JSON:eventName::STRING = 'newPlayer'

GROUP BY USER_ID, EVENT_JSON:sessionID::STRING, EVENT_JSON:platform::STRING,

YEAR(EVENT_TIMESTAMP), WEEK(EVENT_TIMESTAMP)

),

session_durations AS (

SELECT

fs.USER_ID,

fs.session_id,

fs.platform,

fs.first_session_start,

fs.session_year,

fs.session_week,

MIN(e.EVENT_TIMESTAMP) as session_start,

MAX(e.EVENT_TIMESTAMP) as session_end,

DATEDIFF(second, MIN(e.EVENT_TIMESTAMP), MAX(e.EVENT_TIMESTAMP)) as duration_seconds

FROM first_sessions fs

JOIN EVENTS e ON fs.USER_ID = e.USER_ID

AND fs.session_id = e.EVENT_JSON:sessionID::STRING

WHERE e.EVENT_DATE > CURRENT_DATE-270

AND fs.platform IS NOT NULL

GROUP BY fs.USER_ID, fs.session_id, fs.platform, fs.first_session_start,

fs.session_year, fs.session_week

)

SELECT

session_year,

session_week,

CONCAT(session_year, '-W', LPAD(session_week, 2, '0')) as year_week,

ROUND(APPROX_PERCENTILE(duration_seconds, 0.1), 2) as p10_duration_seconds,

ROUND(APPROX_PERCENTILE(duration_seconds, 0.5), 2) as median_duration_seconds,

ROUND(APPROX_PERCENTILE(duration_seconds, 0.9), 2) as p90_duration_seconds,

ROUND(AVG(duration_seconds), 2) as average_duration_seconds,

COUNT(*) as total_sessions

FROM session_durations

WHERE session_year IS NOT NULL

AND session_week IS NOT NULL

GROUP BY session_year, session_week

ORDER BY year_week ASC;

Анализ длительности первой сессии по версиям за последний год

И еще интереснее сравнить длительность первой сессии для каждой версии игры за последнее время.

WITH first_sessions AS (

SELECT

USER_ID,

EVENT_JSON:sessionID::STRING as session_id,

MIN(EVENT_TIMESTAMP) as first_session_start,

EVENT_JSON:clientVersion::STRING as version

FROM EVENTS

WHERE EVENT_JSON:eventName::STRING = 'newPlayer'

GROUP BY USER_ID, EVENT_JSON:sessionID::STRING, EVENT_JSON:clientVersion::STRING

),

session_durations AS (

SELECT

fs.USER_ID,

fs.session_id,

fs.version,

fs.first_session_start,

MIN(e.EVENT_TIMESTAMP) as session_start,

MAX(e.EVENT_TIMESTAMP) as session_end,

DATEDIFF(second, MIN(e.EVENT_TIMESTAMP), MAX(e.EVENT_TIMESTAMP)) as duration_seconds

FROM first_sessions fs

JOIN EVENTS e ON fs.USER_ID = e.USER_ID

AND fs.session_id = e.EVENT_JSON:sessionID::STRING

WHERE e.EVENT_DATE > CURRENT_DATE-360

AND fs.version IS NOT NULL

GROUP BY fs.USER_ID, fs.session_id, fs.version, fs.first_session_start

)

SELECT

version,

ROUND(APPROX_PERCENTILE(duration_seconds, 0.1), 2) as p10_duration_seconds,

ROUND(APPROX_PERCENTILE(duration_seconds, 0.5), 2) as median_duration_seconds,

ROUND(APPROX_PERCENTILE(duration_seconds, 0.9), 2) as p90_duration_seconds,

ROUND(AVG(duration_seconds), 2) as average_duration_seconds,

COUNT(*) as total_sessions

FROM session_durations

WHERE version IS NOT NULL

GROUP BY version

ORDER BY version DESC;

Пример например

На примере веб-игры Ферма на острове (https://yandex.ru/games/app/336608), я собрал следующий запрос (ниже опишу разницу):

WITH first_sessions AS (

SELECT

USER_ID,

EVENT_JSON:sessionID::STRING as session_id,

MIN(EVENT_TIMESTAMP) as first_session_start,

EVENT_JSON:clientVersion::STRING as version

FROM EVENTS

WHERE EVENT_JSON:eventName::STRING = 'newPlayer'

GROUP BY USER_ID, EVENT_JSON:sessionID::STRING, EVENT_JSON:clientVersion::STRING

),

session_durations AS (

SELECT

fs.USER_ID,

fs.session_id,

fs.version,

fs.first_session_start,

MIN(e.EVENT_TIMESTAMP) as session_start,

MAX(e.EVENT_TIMESTAMP) as session_end,

DATEDIFF(second, MIN(e.EVENT_TIMESTAMP), MAX(e.EVENT_TIMESTAMP)) as duration_seconds

FROM first_sessions fs

JOIN EVENTS e ON fs.USER_ID = e.USER_ID

AND fs.session_id = e.EVENT_JSON:sessionID::STRING

WHERE fs.version IS NOT NULL

GROUP BY fs.USER_ID, fs.session_id, fs.version, fs.first_session_start

)

SELECT

version,

ROUND(APPROX_PERCENTILE(duration_seconds, 0.1), 2) as p10_duration_seconds,

ROUND(APPROX_PERCENTILE(duration_seconds, 0.5), 2) as median_duration_seconds,

ROUND(APPROX_PERCENTILE(duration_seconds, 0.9), 2) as p90_duration_seconds,

ROUND(AVG(duration_seconds), 2) as average_duration_seconds,

COUNT(*) as total_sessions

FROM session_durations

WHERE version IS NOT NULL

GROUP BY version

HAVING total_sessions > 100

ORDER BY version DESC;

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

1. Я исключил данные по версиям, в которых было менее 100 первых сессий, чтобы убрать всплески:

Вот эти пики точеные портят картину

Вот эти пики точеные портят картину

Например тут было две сессии, где игроков затянуло

Например тут было две сессии, где игроков затянуло

2. Выгребаю данные за всё время, чтобы вот вообще всё увидеть :D

Вот, что получилось:

Результат анализа времени первой игровой сессии

Результат анализа времени первой игровой сессии

Релиз 1.1.2 от 30 октября 2024 года каким-то образом сломал первое впечатление об игре.

50% игроков проводили 43 секунды и меньше в свою первую игровую сессию

50% игроков проводили 43 секунды и меньше в свою первую игровую сессию

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

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

В браузерных играх, Unity Analytics складывает идентификатор пользователя в куки, а как только они протухают, то обновляет его. Получалось, что каждый раз, игра идентифицировала игрока по новой и считала, что это его первая сессия.

Решение было простым: генерировать случайный идентификатор и сохранять его в данных игрока, а затем использовать в качестве UnityServices.ExternalUserId.

20 октября была выпущена версия 1.2.0, в которой игра начала идентифицировать игроков корректно:

Это позволило адекватно оценить продолжительность первой игровой сессии и составить ряд гипотез. Первое, что бросилось в глаза после плейтестов: игра дарит игроку снаряжение, но не объясняет, как им пользоваться.

Спустя еще неделю игра начала обучать игрока экипировать и прокачивать снаряжение, и вот результат:

Это дало прирост в две минуты или ~28%!

После нескольких релизов летом, начиная с реализации защиты от накруток при переводе времени на устройстве, медиана начала падать:

Возможно, механики просто наскучили и игроки хотят чего-то нового.

Гипотезы закончились, проект наскучил и я переключился на новый.

Заключение

Надеюсь, что мне удалось рассказать что-то интересное и поделиться опытом аналитики.

Спасибо за внимание! Жду вопросы в комментариях.

Показать полностью 7
2
Вопрос из ленты «Эксперты»

Всем привет! я создаю игру на юнити, и я столкнулся с проблемой того, что мой подкат ("sliding") не работает

Привет! Я не большой специалист по программированию, но я пытаюсь создать игру в unity.Я создаю код с помощью руководств и обнаружил проблему: у меня не работает слайдинг.(

Я не знаю причины, но в коде нет "красных" ошибок, но вот код:

Вот настройки персонажа:

Если кто сможет помочь, буду крайне благодарен!
Спасибо!

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

Продолжение поста «Моя попытка номер 5»4


Приложение в RUSTORE.

Начало разработки приложения на тематику зомби-шутера с элементами лабиринта. Выложил первую пре-альфа версию в RUSTORE. Хочется попробовать развивать ее и посмотреть что из этого выйдет.


Вот ссылка если кому-то будет интересно посмотреть
https://www.rustore.ru/catalog/app/com.unity_7imbas.D.A.X.Z....

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

Продолжение поста «Моя попытка номер 5»4

Добавил меню, подогнал все иконки к единому стилю,сделал выбор оружия, добавил эффекты спавна противников. В ближайших планах добавить дробовик. Сделать NPC который будет открывать оружие. Добавить усталость. Реализовать эффекты между загрузками.

Ну а пока вот так.

9

У нашей первой игры на Unity появилась демка в Steam!

Игра называется Life Slash Death

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

Платформы: Windows, Mac. Также игру можно установить на Steam Deck - управление адаптировано.
Жанр: ARPG

Нашу игру можно найти в Steam. Там-же можно скачать демо-версию проекта.

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

Также готова ответить на интересующие вопросы!

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

White Cat Companion: Вышла пре-альфа!

Ранее я уже рассказывал про свою игру White Cat Companion — 3D-симулятор жизни с антропоморфной кошкой Киарой. Сегодня рад сообщить, что вышла пре-альфа версия игры , которую можно попробовать уже сейчас на Game Jolt !

🐱 О чём игра?
Вы — студент, который переезжает в квартиру, где уже живёт соседка — Киара, белоснежная антропоморфная кошка, разработчик игр. У вас будут общие кухня, коридор и ванная, но самое главное — вы будете строить отношения, которые могут вылиться либо в крепкую дружбу, либо в романтические связи.

White Cat Companion: Вышла пре-альфа!

🔍 Что есть в пре-альфе:

  • Базовая локация

  • Реакции персонажей друг на друга

  • Система диалогов с ветвлением

  • Эмоции Киары (в заготовках их около 50!)

  • Основные механики взаимодействия

  • Глубокая система отношений: каждый выбор влияет на развитие событий.

  • Физика ушей и хвоста: да, это важно. Особенно если вы фанат пушистых персонажей.

  • Уютная атмосфера с элементами повседневности и случайных событий.

  • Более 200 катсцен и ивентов в планах — с юмором, эмоциями и неожиданными поворотами.

  • Куча отсылок и пасхалок для ценителей.

🚀 Где можно попробовать?

Сборка доступна на Game Jolt :
👉 https://gamejolt.com/games/WhiteCatCompanion/1004883

Также планируется выпуск тестовой сборки для активного сообщества — если хочешь стать тестером , пиши в комментариях или заходи в наш Telegram-канал:
👉 https://t.me/KendAdndUnity


✍️ Нужна помощь сообщества!

Хочу вовлечь вас в процесс!
Если у вас есть идеи:

  • Для новых ивентов

  • Катсцен

  • Диалогов

  • Или просто критика и предложения

— буду рад услышать!

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

White Cat Companion — ваш новый виртуальный друг!

Я работаю над 3D-игрой про жизнь с антропоморфной кошкой Киарой — она умеет:

💬 Общаться с вами (500+ реплик с ветвлением)

😻 Выражать как минимум 12 эмоций (от "радости" до "неподдельного шока") (в заготовках их под 50)

🎮 Реагировать на ваши действия (система отношений, дружеские романтические, или всё также незнакомые)

🏠 Жить своей жизнью в общей коммуналке

Почему это круто?

Глубокая система диалогов как в визуальных новеллах (каждый выбор на что то влияет)

Реалистичная физика ушей и хвоста (да, это важно!) они развиваются, двигаются и прочее

Уютная атмосфера с элементами симулятора жизни

более 200 ивентов (с катсценами естественно)

Куча пасхалок и отсылок

Прикрепляю первое демо-видео

(пока готовиться альфа)

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

ЧТО МНЕ НУЖНО - хотелось бы чтобы не только я, но и аудитория игры придумывала ивенты, диалоги и кат сцены, принимаются любая критика и идеи

🐱 Скоро будет сборка для тестеров. Как вам концепция?
НУЖНЫ ТЕСТЕРЫ

подробнее о игре в канале https://t.me/KendAdndUnity

Показать полностью 1
Отличная работа, все прочитано!