Геймдизайн и Немного псевдокода физики в игре Phisia от разработчика

Попробую затронуть тему геймдизайна и вообще создания игрового движка(программирование) как такового с нуля человеком, который самостоятельно всё изучал и писал всё первый раз на примере игры Phisia

Тизер игры для девгамма 2018

ИДЕЯ

Была следующая: Все любят собирать паззлы, значит и паззл в виде 3д тоже должен быть интересным. В реальности это Лего и ему подобные конструкторы. Но так как мы делаем видеоигру, которая должна отличаться от реальности - "Стараться улучшить реальность, сделать красочнее, добавить чуть чуть магии и т п", то обычные реалистичные конструкторы заменены на любые модели каких то реальных объектов, которые не очень привычно представлять в роли конструкторов.

Конвертация ИДЕИ в прототип

Разобравшись с этим я прикинул, что реализовать склейку объектов довольно сложно, если эмулировать управление кусками в реальном 3д пространстве по реальным законам, потому что параметров управления настолько много, что игра превратиться в тяжкое испытание, а мобильные игры должны быть в первую очередь простыми и понятными, а уже потом хардкорными(когда игрок освоится в новом мире и научится им хорошо управлять). Изначально я вообще хотел каждый кусок объекта всегда оставлять на своем пространственном положении и оставить игроку только возможность вращать объект, но не перемещать его - это был минимальный враиант, потому что я не обладал навыками программирования в юнити вообще и последний раз программировал около 10 лет назад в университете на Delphi :)) Игру я хотел сделать в любом случае и в любом виде, поэтому ставил минимальные задачи и двигался к их выполнению последовательно.

Программирование в юнити просто волшебное, особенно после года страданий с UE и его Блюпринтами:) . Компонентная система действительно дает очень низкий порог входа для всех людей независимо от их опыта.

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

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

Живой Стрим игры на ДевГамм 2018

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

Реализация Физики

До состояния тизера создание управления кусками прошло примерно 100 итераций частичного переписывания и 5 раз полного. Основной проблемой было несоответствие вида из камеры - физическим осям "кусков", потому что управление передавалось 2мя осями экрана X,Y в 3д мир XYZ при этом игрок видел всё под немного кривым углом для придания перспективы и объема сценам. Поэтому первое полностью реально управление со всей честной физикой - вызывало некоторое недовольство у тестеров, потому что повороты всегда вели себя не очень адекватно(особенно когда смешивается центр масс и моменты инерции). Поэтому пришлось при вращении не использовать физику, а делать всё Чётко в плоскости экрана с помощью Transform.Rotate() вместо AddTorque(). Эмулировать физически корректную инерцию пришлось фейком, но зато объекты перестали при вращении глупо себя вести. Это был прорыв в управлении, после него гораздо больший процент людей мог играть комфортно и получать от этого удовольствие, а не боль и страдания :)

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

После создания прототипа управления:

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

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

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

В итоге за 2 месяца получилось создать около 24 игровых уровней в 3х разных локациях 4 разных игровых механики и успеть собрать тизер для ДевГамм :)

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

Новая игра, рабочее название - АнтиПаззл
3434
25 комментариев

Интересная статья, автору удачи! Игра выглядит очень неплохо. Какой штат сотрудников ее создал?

2
Ответить

1 программист, 1 3дшник - левел/энвайронмент дизайнер и 2 моделлера игровых объектов.

1
Ответить

Любопытно. За два месяца получилось собрать почти готовую игру, при этом почти не имея навыков программирования. Впечатляет. Ну и Юнити, выходит, всё-таки настолько юзерфрендли?

1
Ответить

по сравнению с Анрилом это небо и земля :)

2
Ответить

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

1
Ответить

Да, это интересно. Побольше бы такого контента.
В последнее время DTF все больше напоминает DTF. Это радует.

Ответить

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

Ответить