Gamedev Skilltek Me
762

Раздвигая горизонты. История создания игрового проекта

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

В закладки

Идея

Идею создать платформу для геймеров вынашивали уже несколько лет. Основной мыслью было объединить сильные стороны двух типов ресурсов - информативность игровых форумов, чей недостаток в узкой специализированности, и, мягко говоря, неприветливости для новых пользователей; и, с другой стороны, социальных сетей, которые обладают широкой и разнообразной аудиторией, но с каждым годом все сильнее хромают в качестве контента. Проблема качества на первый взгляд лежит на поверхности - объемный и информативный контент читает меньше людей и как следствие меньше лайкают. Таким образом создавать такой контент менее выгодно, чем публиковать мемасики, и эта вроде бы очевидная проблема не имеет простого решения.

Интернет содержит много полезной для игроков информации, но вся она разбросана по темным уголкам и никак не структурируется. Никто не переваривает весь этот объем контента, потому что рентабельным оказывается только то, что популярно, а не полезно. Мы понимали, что нужно как-то мотивировать людей ориентироваться на хороший контент и работать над качеством в целом, и отталкивались от этой идеи при создании концепт-модели проекта.

Концепт

Очевидно, на платформе, ориентированной на качественный контент, нужна система рейтинга контента, однако формат “рейтинг ради рейтинга”, как на том же реддите, нас не устраивал. Рейтинг, на наш взгляд, помимо отображения “крутости” пользователя, должен приносить практическую пользу его обладателю, тем самым стимулируя к участию на платформе. “Преврати свой ценный опыт в реальную выгоду” - к реализации этого лозунга должен прийти наш проект, а реальной выгодой для геймеров, помимо денег является игровой контент, рынок которого сейчас не перестает расти.

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

Ответ на вопрос: “как донести до геймеров принципы нашей экономической модели?” оказался удивительно прост - сделать экономическую игру! Зашить все сложные для простых юзеров механизмы в логику игры, и дать пользователям инструменты в виде игровых элементов, вот как!

Первые шаги

Начинать работу над игрой нужно было с решения вопроса, в каком виде она будет реализована - в изометрии, которая проще в реализации как с точки зрения геймдизайна, так и создании графики; или же в трехмерном варианте, который гораздо более требовательный, но имеет лучшие возможности и внешний вид. Несмотря на то, что изометрия “вроде бы” удовлетворяла текущим нуждам игры, мы не стали идти простым путем. Движком для игры был выбран Unity 3D, ввиду его универсальности и широких возможностей.

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

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

Туториал

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

Изначально у пользователя была свобода действия - он начинал на пустом поле, имея в инвентаре один модуль. Диалоговые окна объясняли ему, что этот модуль делает, он его использует, получает следующий и так далее, то есть обучение проходило в форме заданий, проходя которые юзер должен был разобраться в геймплее. Но на деле все было не так - тестеры постоянно застревали и задавали вопросы. В основном одни и те же. Переработка диалогов помогла чуть лучше чем никак, и потому решено было свободу у юзера отнять - сделать скриптовый туториал.

Типа тыкай сюда, ставь туда и читай внимательно. Ужасная, конечно, штука, но лучше еще ничего не придумано.

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

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

Оптимизация

Это как правило титанический пласт работ, и наш случай не исключение. Делая 3D игру на Unity, с детальными моделями, визуальными эффектами и красивым окружением, да еще которая должна работать в браузере, с очередным обновлением мы уперлись в планку - у некоторых тестеров игра просто перестала загружаться!

Unity нельзя назвать прожорливой платформой, однако в нашем случае мы должны подстраиваться под аппетиты Гугл хрома и его коллег по бизнесу. При превышении планки объема оперативки на один процесс он просто отказывается его инициализировать. Да и сам при этом жрет немало. Сделать нативный клиент и послать гугл к чертям несложно, однако это решение нам не подходит, потому как говорить “скачай наш клиент или проваливай” юзеру, который впервые зашел и не знает о нас, было не вариант. Поэтому пришлось работать с тем что есть.

Итак, что надо было сделать ради высшей цели - оптимизации:

Снизить нагрузку рендера. Был создан атлас текстур, который подтягивает однотипные текстуры из одного файла, исключая повторения; выпилили лишние элементы; настроили систему Occlusion Culling, отключающую рендеринг заслоненных объектов, а также объектов, не попадающих в зону видимости камеры. Инструмент не очень сложный, но довольно полезный для снижения нагрузки

Скриншот из рабочей переписки

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

Далее настроили пакетную обработку (Static Batching + Dynamic Batching), целью которой является объединение игровых объектов в большие группы и отправка их на рендер. Изучая детально этот вопрос, выяснили, что для финальной настройки существуют определенные требования к моделям и их текстурам, которые уже были разработаны. Таким образом мы попали в вилку - смириться с нагрузкой либо делать новые модели и текстуры, то бишь пилить всю визуальную часть с нуля. Легких решений проблемы не было, и потому пришлось временно отключить все "не игровые" элементы до тех пор, пока не будут готовы новые модели. Эх, а такое было красивое окружение…

Уменьшить размер билда. Данный пункт реализовывали путем сжатия текстур под формат Unity, так как основную часть билда занимают именно текстуры.

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

Мы просто заменили это свечение на другое, которое на глаз почти неотличимо, но создает на порядок меньше объектов и оттого существенно облегчает задачу его обработки.

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

Переход на React.js

В давние времена, когда я баловался построением ламповых деревушек в играх на фейсбуке, я часто натыкался на одну бесячую особенность - играешь себе в игру, строишь заборчики и ни о чем не переживаешь. Тут всплывает сообщение, ты на автомате на него кликаешь, и бац! Тебя выбрасывает на страницу сообщений и пожалуйста - загружай игру заново. Чтобы избежать таких досадных моментов, наш разработчик предложил перевести сайт на React, который бы в свою очередь подтягивал фрейм с Unity. Таким образом игра остается инициализированной, позволяя юзеру на той же вкладке прыгать по всем разделам сайта, не испытывая никаких проблем.

Создание MVP и тестирование

Нет это не most valuable player, если вы об этом подумали.

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

Поэтому было принято решение провести тестирование. Мы выкатили текущую рабочую версию игры, сделали основной функционал для портала, прикрутили редактор и приобрели шмот для стима в качестве наград.

Цель тестирования, как я и сказал, в получении обратной связи. Нам важно понять, как игроки будут нас воспринимать, понимание наших преимуществ и недостатков “с другого конца” будет для нас очень полезным. Потому как впереди еще много работы, однако главный принцип проекта - публикуй качественный контент и получай от этого выгоду - реализован уже сейчас. Год назад мы взялись за довольно смелый проект и провели большую работу, а что из этого получилось, вы можете посмотреть на нашем сайте. Заходите, пользуйтесь и оставляйте обратную связь - это крайне важно для нас, потому что мы искренне хотим раздвинуть горизонты и привнести нечто новое в игровую среду.

Спасибо за уделенное время! Если вас заинтересовал наш проект, вы можете оставлять свои комментарии и следить за нашими новостями в соцсетях VK и Instagram

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Skilltek Me", "author_type": "self", "tags": [], "comments": 29, "likes": 16, "favorites": 49, "is_advertisement": false, "subsite_label": "gamedev", "id": 43015, "is_wide": false, "is_ugc": true, "date": "Fri, 15 Mar 2019 19:30:36 +0300" }
{ "id": 43015, "author_id": 119894, "diff_limit": 1000, "urls": {"diff":"\/comments\/43015\/get","add":"\/comments\/43015\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/43015"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64954 }

29 комментариев 29 комм.

Популярные

По порядку

Написать комментарий...
5

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

Ответить
2

И я прочитал три абзаца и понял, что дальше еще больше не пойму. На этом и остановился. :)

Ответить
0

Ну, это статья в том числе про геймдев, поэтому старался писать детально. В следующей статье постараюсь быть проще)

Ответить
4

История создания игрового проекта

Идею создать платформу для геймеров

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

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

На сколько я понял:
вы создаете Социальную платформу для геймеров, сочетающую социалку и форумы. А местная валюта, эквивалентная социальной активности, могла бы тратиться на игровые предметы для прицепляемых к платформе игр.

А дальше уже можно понять, интересно читателю это или нет и есть есть смысл вникать, если интересно.

Ответить
0

А что значит сочетать социалку и форум? Мне кажется грань тонкая между ними..

Ответить
1

Форум - это, прежде всего, структурированный по веткам материал.
К нему можно прикрутить социальные функции в виде лайков и френдования, но можно и не прикручивать. А социалка - это изначально личная страница/стена с потоком сознания и направленность на вовлечение в процесс залайкивания друг друга до смерти :D
Но вообще, да - грани могут быть очень размыты.

Ответить
0

Про Залайкивание досмерти верно подмечено xD
Постоянно хочется дизлайкнуть, а нет..

Ответить
0

Вы очень точно сформулировали основную мысль! И да, очень приятно что изучили статью и дошли до сути.
Могу я в дальнейшем использовать ваши тезисы?)

Ответить
0

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

Ответить
0

Спасибо, учтём)

Ответить
2

Хм типа кармы на дтф шо ли? только за которую шмотки можно покупать?) Дак вы разоритесь если туда толпа набежит местная) она умеет рейтинг набивать)

Ответить
0

На то и рассчет - посмотрим как у них это получится ;)

Ответить
1

Тут Макс Фрай есть такой - борется за свою карму отобранную местными властями) Его позовите) Хотя я не в теме

Ответить
1

Мне дико стыдно, Ома, но я не могу удержаться..

Ответить
0

Боюсь, до меня не дошел ваш тонкий намек) но мне очень любопытно

Ответить
0

А ну слава богу. Мне ж главное пошутить просто

Ответить
0

Для этого и существуют коменты на дтф)

Ответить
0

Удачи в разработке!

Ответить
0

Большое спасибо, будем стараться)

Ответить
0

“Преврати свой ценный опыт в реальную выгоду” - это как?)

Ответить
0

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

Ответить
0

Дак а шмотки откуда берутся?

Ответить
0

На этапе раскрутки из средств разработчика. В дальнейшем будет p2p обмен во внутренней валюте

Ответить
0

Вы поддерживаете мобильные устройства?

Ответить
0

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

Ответить
0

Обычно это так не выглядит, видимо съехала вёрстка. Спасибо за репорт! Будем исправлять

Ответить
0

Слева вроде список тематик, но соглашусь - при перемотки вниз надо ее закрепить например

Ответить
0

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

А еще зарегился, у вас лишний пробел в коде и логине приходит на почту, это косяк.

Это короче какая то ферма. Так сразу и надо писать.

Ответить
0

Дак ферма то не обычная - ты в неё не поиграешь без постов и оценок..здесь игра вообще вторична

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
Узнавайте новости о мостах
Санкт-Петербурга первыми
Подписаться на push-уведомления