3D платформер Онлайн за 30 дней, или трудности с онлайном
Всем бобра читающие. Сегодня хочу поделиться историей о том как мы вдвоём усердно, эвридей накодили игру, и что из этого вышло. Немного лирики, технички, видосиков и скриншотов.
"...Дело было вечером, пиво пили весело..."
Но одним из вечеров звонит мне друг, говорит давай мол игру сделаем, а то типа сидим и ничего не делаем. Вот так просто, да. Развили немного тему, и мол говорю а давай, только чтобы был не долгострой. И я и мой друг оба мы кодеры на c#, движок понятное дело "Единство" был выбран, в команду нам никого не нужно, так как 3Д артист у нас есть, приступили к концепту.
Оговаривать что будет за игра, что в ней за механика , а что в ней "не баг, а фича" и перенесли весь разговор на Трелло, так как срок который мы себе обозначили, это 1 месяц. Так же сразу обговорили где будем публиковаться, будет это WebGL на Яндексе.
Долго думать не стали над игрой, а взяли на момент хайпа игру OnlyUp! за основу, и прикинув что можно сделать, решили сделать нечто похожее только со своими фичами. Выбираем скалолаза, даём ему в руки механики и пускаем в OpenWorld. Идея классная. Мол сотни тысяч игроков пытаются первыми добраться до вершины и при этом ещё есть вариант мешать друг другу, круто.
Определились, приступили.
Движок игры выбран, пора определиться с сетевой составляющей.
Долго выдумывать тут тоже не пришлось. За основу взят Mirror. Мы с ним уже работали и составляющую знаем не плохо. Плюсы и минусы описывать тут все не стану, я лишь поделюсь хитростью за что этот движок я считаю крутым, но об этом чуть позже.
Так движок есть, с сетью определились, что дальше.
А дальше выбор на котроллер управления. Мой друг сказал. Я напишу контроллер за пару часов, и спустя день уже чуть ли не плакал. Я предложил что не нужно изобретать велосипед и что воспользуемся готовым решением. Тут хотелось часть работы скостить и выбрать уже готовое решение, но оно должно было подходить для нас, чтобы легко было переписать его под сетевой код.
Первым кандидатом был StarterAsset от юнитеков. Ассет подходит для большинства требований, и нам он тоже подходил. Выбрали и поехали разбираться в коде и переписывать.
Параллельно дали нашему артисту задание сделать перса в 1000 полигонов. Перс был готов уже на следующий день, а мы пока разобрались что за что отвечает. Собрали прототип и запустили сервак, сделали динамический спавн блоков чтобы немного понять на что хватит ресурсов.
Попробовали, поигрались, вроде всё отлично. Значит вектор верный.
После настроенного клиента и писанины, спустя 1,5 - 2 недели дело доходит до первого скилла. Толчок\Удар соперника, нужно чтобы твой соперник ушёл в накдаун. И тут началось самое интересное. Мы решили что эпично будет при ударе вызвать Ragdoll у соперника, но получили мы только DoggyStyle от Unity.
На словах то всё круто, но на деле всё сложно. Дело в том, что отобразить правильно по сети одинаковый полёт рэгдола это не реально, а если и реально то очень затратно на сеть, да так затратно что проще забыть. В крупных играх ААА делают хитро. Синхронизируют положение тела, а рэгдол у каждого отображается свой, оно наверно и правильно, это ведь всего лишь прикольная фича, но в нашем случае должна была стать механикой. После долгих мучений, и рассинхрона с сервером, было принято отказаться от данной механики, заменив просто станом. Игрок не может двигаться 5 секнуд после удара, но и тут нас ждал сюрприз. Дело в том что в технической части у стандартного ассета в Unity игрок управляется по средствам CharacterController, который нам не подходил к гейплейным механикам, и мы этого не учли на этапе наших раздумий, а ведь всё так начиналось хорошо. По нашей задумке, при ударе игрока он должен был отлететь по параболе, а CharacterController никак не хотел выполнять задуманное по сети. Почти неделя мучений и ничего, никакого результата. В такие моменты группы энтузиастов, которые решили сделать свой The Last of Us просто разбегаются, но я принимаю решение, которое просто в корне поменяет весь подход в дальнейшем. Мы просто вырезаем стандартный ассет от юнитеков, а там на минуточку были жёстко уже привязаны фичи, такие как "вскарабкивание" на стены, сетевое передвижение и аниматор, и берём ассет от Invector, у них есть бесплатный стартовый ассет. Код лаконичный, старый InputManager конечно, но с ним жить можно, под механики подходит, всё как надо, и переписываем под себя его. Заняло это день - два.
И снова всё пошло как по маслу.
Нашему артисту дали задание делать пропсы для уровня с отсылками, чтобы потихоньку собирать уровень.
Работа продолжалась, уровень начинал обрастать пропсами и даже на телефоне всё хорошо отображалось
Была добавлена IK для ножек, чтобы персонаж немного чувствовался
Дошли до второго скилла и до третьего. Много тестов и проб, но таких уже проблем небыло и думали и не будет. Ага.
Вроде всё идёт хорошо, работу мы с другом разделили. Он делал скиллы, я занимался сеткой.
Время от времени занимались уровнем, наводили марафет, и не задумывались об производительности, потому что я знал что оптимизацию сделать смогу.
Вроде уже и почти готово всё, и 4 недели позади, но блин, как то всё не красиво и коряво, не информативно. Немного поигрался с написанием шейдеров, и чуть лучше стало.
Но всё равно коряво работал снежок. Нужно было курсором попасть на игрока который мог бегать и прыгать, просто кошмар. Решили переписать, и тут опять затык. В геометрии и математике у меня двойки и я 3 дня сидел и решал задачки 9 класса. Казалось бы, все блоггеры и ютуберы говорят что быть программистом может и дворник, и что без математики и геометрии Вы станете супер разрабом, но давайте быть честными, крутого своими руками Вы сделать ничего не сможете, а засыпать проект ассетами любой сможет.
Чистый проект, и писанина кода только для метания снежка. 3 дня и всё готово.
3 скилл это бутсы, которые тебя немного поднимали вверх. С ними тоже было не всё гладко, точнее всё гладко до первого внештатного рассинхрона с сервером, и персонаж улетал на марс. Но трудностей с настройками не возникло. И вроде уже всё готово. Много уже чего исправлено и переписано, я не говорю тут о создании партиклов, о написании шейдеров, о поиске музыки и спецэффектов, о поиске и оптимизации пропсов (наш артист не успевал) в блендере, это всё было как то быстро и параллельно. И вот спустя 30-35 дней мы получаем прототип с 30-50 FPS. Вроде как уложились, и персов уже поменять успели
Уже и механик накрутили больше. Динамическую смену дня и ночи сделали и фонарь, магазин со шмотом сделали, и Feeder динамический.
И пора бы оптимизировать и выпускаться. Оптимизация заняла около 10 дней
и с 40FPS теперь на максимум настройках получаем ~200
Привести проект к чистоте, подогнав размеры и вырезав надписи в Разработке около 5 дней. На этапе был вырезан шмот, так как не до конца сделана логика записи в БД, требует доработки, и смена дня и ночи тоже есть один момент который требует теста.
Итого теперь в игре у нас есть скиллы, таблица лидеров, чат. И всё прекрасно работает и синхронизируется по сети, но после билда мы понимаем что с WebGL мы пролетаем, так как минимальный размер который удалось достичь это 140Мб из 100 возможных. Пережимать модели и текстуры нет желания, так как проект перерастает сам себя, возможно, если всё пойдёт по плану, это будет сделано, так как в планах есть желание сделать под мобилку, тогда и WebGL сможет существовать, но не сегодня и не завтра. Итого за месяц мы смогли сделать то что запланировали, шлифовка и полировка проекта в расчёт не берём, хотя конечно надо. Но всё равно это большая победа для нас же самих.
Конечно мы хотим выпуститься на всех возможных площадках и бесплатно.
На данном этапе у нас есть страница на ITCH и надежды на миллионы)
Нам будет очень приятно если Вы загрузите себе игру и немного дадите фидбека.
Конечно это не Production, но остались мелочи которые мы обязательно доделаем. Нам нужны живые тестеры которые помогут выявить проблемы о которых мы наверняка ещё не знаем, но все они решаемы.
А теперь немного хитрости про Mirror. Сервер зеркала имеет одну особенность, мы можем запустить сервер на 1 порте в одном экземпляре, но никто не ограничивает нас запустить 1000 серверов на разных портах. Хитрость в том, что мы можем запустить сервер 0.0.0.0:22001 и делать новую версию игры, и как только сбилдим патч, то запустим сервер с новой версией на 0.0.0.0:22002 и игроки не будут выброшены с сервера и Вы не увидите сообщение о том что сервер на обновлении.
Нам нравится делать игры, и мы надеемся что Вы оцените нас по всем суровым законам. Мы так же надеемся, что Вы вдохновитесь данной статьёй, и сделаете свой проект не смотря на трудности, ведь по сути нам пришлось начинать с ноля несколько раз.
P.S.Мы не супер разработчики с гугла, мы не питаем надежд стать AAA игрой. Возможно мы что-то делаем не правильно. Мы простые парни которым нравится делать игры. Мы не претендуем на научную или образовательную статью, мы просто делимся своим небольшим опытом, и надеемся на отзыв таких же простых ребят как и мы. Наша следующая остановка это Steam и Epic Games Strore. Выпуск игры бесплатно. Только стиль в игре планирует быть за деревянные, чтобы как то содержать штаны и сервер.
Пока на Itch слабо траффик идёт. Ну чтоже, встретимся на следующей остановке...