Pull to refresh

Как за полгода разработать многопользовательскую 3D-игру без художников, дизайнеров и моделлеров

Abnormal programming *Python *Game development *Unity3D *


Привет, Хабр!
Историй о разработке игр было немало, сегодня я попробую вкратце рассказать нашу.

Мир есть текст — Жак Деррида
Игра есть словарь — a11aud


Идея


Началось все с выдвинутой a11aud идеи что состояние большинства процессов можно представить конечным автоматом, который управляется командами. Состояние этого конечного автомата представляется в виде словаря, работа с которым производится на языке высокого уровня, в нашем случае на Python. Такой подход сулил много преимуществ при должном выборе технологий. Антон запилил тестовый мессенджер на tornado и все об этом благополучно забыли.

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

Их было четверо


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

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

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

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

Технологии


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

Для клиентского приложения был выбран Unity: кроссплатформенность, прекрасная поддержка, легкость вхождения сделали этот движок единственным разумным решением в условиях нашего коллектива.

Взаимодействие между сервером и клиентом было решено осуществлять по сырому протоколу websocket. Подкупила простота работы в tornado, но потом это аукнулось.
Но обо всем по порядку.

Немного азов


Что такое любая игра? Это цикл расчета игрового мира с неким шагом расчета, продолжающийся до победы/поражения. Ровно так же на клиент прилетают состояния игры, которые он отрисовывает, попутно отсылая на сервер действия игроков. Игровых данных может быть очень много поэтому для того, чтобы на одном сервере могло быть запущено около 5000 игровых приложений, нам пришлось пройти следующий путь:
  1. Первоначально мы гоняли json-сериализованное состояние игрового мира.
  2. Когда стало ясно, что 10 инстансов это маловато, был реализован diff-алгоритм, который позволил слать только дельта-состояние. Жить стало лучше.
  3. Спецификация websocket’ предполагает возможность сжатия трафика алгоритмом deflate. Но к сожалению в той реализации, которую мы выбрали, сжатие зависело от системных библиотек и разнилось на Windows и MacOS. Пришлось лезть в исходники и делать свое сжатие с орлянкой и гоблиншами. Это дало выигрыш еще в 40 раз. Жить стало веселее.



Игровая механика




Расчет боя происходит по очевидной схеме: юниты сближаются, если расстояние до ближайшего врага позволяет провести атаку, завязывается драка с расчетом повреждений. Звучит просто, но в реале это алгоритм квадратичной сложности и на массовом замесе серьезно сказывается скорость работы python. Было применено комплексное решение:
  1. Юниты стали храниться в R-дереве. Это снизило длину цикла расчета целей для атаки.
  2. При помощи Cython компонент боя компилируется в сишный код. Выигрыш в производительности около 10 раз.


Атака лисят




А теперь вернемся к вопросу, вынесенному в заглавию. Конечно никак. Если игра сложнее крестиков-ноликов, у вас ничего не выйдет. На начальных этапах мы вели отладку на кубиках, потом перешли на бесплатные модели из Unity Asset Store. Когда мы чуть не травмировались от вида атаки щенят и лисят, мы призвали на помощь варяга. На наш призыв откликнулся один замечательный дизайнер из Кишинева. Дизайн, который вы видите на видео, выполнен им, но жизненные обстоятельства наложили на наше сотрудничество некоторые ограничения. Димыч, если ты это читаешь, спасибо огромное за гоблина, скорейшего новоселья, мы тебя ждем.

В общем, если решите пойти по нашим стопам, не начинайте без художников. Несмотря на все мы с оптимизмом смотрим в будущее и продолжаем поиски готовых к сотрудничеству людей.
Only registered users can participate in poll. Log in, please.
В связи с изложенным, интересуюсь у аудитории развивать ли тему:
43.08% Да, давай про мир-словарь и архитектуру Unity-клиента 308
6.15% Да, давай про сжатие 44
31.47% Да, давай про игровые механики и Cython с R-деревом 225
19.3% Нет, но котиков еще запости 138
715 users voted. 244 users abstained.
Tags:
Hubs:
Total votes 41: ↑30 and ↓11 +19
Views 47K
Comments Comments 11