В первом посте об этой игре я рассказал о технических сложностях, которые пришлось преодолеть. Второй пост, который вы сейчас читаете — более лёгкий для восприятия. Здесь я проиллюстрирую гифками весь путь построения физической модели и кратко расскажу о каждом шаге.
От создания нового проекта в Юнити до публикации бета-версии в Стиме прошло 10 месяцев. 90% времени ушло на создание, оптимизацию и вылизывание физической модели, остальное — на геймплей.
Цель была в том, чтобы создать полностью физический мир. Но подход, реализованный в Red Faction показался слишком громоздким и не слишком реалистичным. В той игре меши при взрыве разбивались на куски, на которые натягивались физические коллайдеры. Я решил не мучаться с сопроматом и множеством частных случаев разрушений, а сделать простую систему, работающую во всех случаях.
Сделал всё из взаимодействующих частиц: землю, здания, танки игроков, врагов, снаряды и бонусы — всё. Взаимодействия между частицами реализовал на видеокарте, поскольку для параллельных вычислений она в 50-100 раз производительней процессора.
Получившаяся из частиц материя сначала выглядела странно, и напоминала то ли жидкость, то ли газ:
А для игры нужно было что-то прочное, способное держать форму. Испробовав разные способы взаимодействия частиц, я нашёл, что сила Леннарда-Джонса даёт самую прочную субстанцию. Получилось что-то вроде манной каши. Для экспериментов я добавил взрывы по клику мыши.
У частиц уже есть температура, и материя меняет свойства, оплавляясь от жара взрывов. Сама материя держит объём, частицы стремятся к образованию шестиугольной решётки. Небольшая доля вязкости (в дополнение к силе Леннарда-Джонса) обеспечивает лучшую стабильность материи.
Проблема со стабильностью вот в чём. Дискретность модели ограничивает величину силы взаимодействия между частицами, так как на большой скорости частицы могут за один шаг чрезмерно сблизиться, проигнорировав крутейшую (двенадцатой степени) кривую роста силы отталкивания. Это придаст им огромное ускорение, что сделает новое неестественное сближение ещё более вероятным. Закон сохранения энергии нарушается, материя взрывается. А вязкость позволяет ослабить этот эффект.
Когда материя стала вести себя более-менее удовлетворительно, я собрал из частиц танк и сделал для него управление: на каждом шагу вычислений в видеопамять передаются данные о нажатых игроком клавишах, и эти данные используются для управления вращением колёс и наклоном пушки:
Взаимодействовать с физически реалистичным миром было увлекательно, я был вдохновлён. Игра развивалась именно в том направлении, в котором я хотел.
Затем я добавил модуль построения уровня по картинке: считывались пиксели, и на их месте создавались физические частицы. Кроме того, материя «обугливалась», чернея от длительного воздействия высокой температуры.
На этом этапе обнажилось несовершенство физической модели. Каменные колонны вели себя как желе:
Пришлось пожертвовать производительностью, уменьшить шаг дискретизации, и за счёт этого увеличить силу взаимодействия между частицами, без риска нестабильности. Материя стала более прочной, и я создал несколько разных физических материалов: камень, металл, снег, песок, земля, лёд, желе, и т.д. Каждый материал немного отличался от других, песок был сыпучий, камень прочный, металл прочный и гибкий, а желе гибкое и хрупкое. Дерево горит и превращается в пепел, а лёд прочный, но легко плавится.
Затем я создал из тех же частиц несколько типов летающих тарелок, и всё там же, в выполняемом на видеокарте шейдерном коде, написал управляющую систему для врагов. Они неплохо целятся, уворачиваются друг от друга, и используют разные тактики боя.
Получилось уже довольно похоже на компьютерную игру в традиционном понимании:
На этой гифке можно заметить, что я использовал новую сущность — своего рода кости, задающие расстояние между частицами. Они же и мышцы, так как у них есть характеристика жёсткости и изменяемая во времени длина. Так что стало возможным укреплять высокие здания и делать на уровнях подвижные платформы.
Кроме того, я создал универсальную систему описания оружия, которая позволяла описывать широкий спектр средств уничтожения, просто нанизывая одни унифицированные эффекты на другие, создавая цепочки событий. Появились пулемёты, огнемёты, растраивающиеся в полёте снаряды, многолучевые солнца термоядерных взрывов, веера молний, лавомёты и целая куча силовых модификаторов материи.
И ещё я создал бонусики, чтобы можно было подбирать патроны, усиливать танк или влиять на уровень по принципу кнопка-событие. Например, здесь можно посмотреть, что происходит, когда игрок подбирает ключ:
Также можно заметить подобие интерфейса с полосками здоровья и прочих характеристик танка-персонажа, и со списком доступного оружия.
Игру стало можно публиковать, я потратил неделю на заполнение разнообразных форм на Стиме, на ожидание результатов проверки, оформление странички и изготовление трейлера и скриншотов.
Гринлайт к тому моменту был пройдён, поскольку по мере готовности я публиковал гифки на реддите, вызывая стабильный интерес необычным подходом к построению мира.
Наконец, игра вышла в раннем доступе, вот трейлер:
(Музыка — из техно-оперы Виктора Аргонова «2032». Не очень подходит по смыслу, но волнующая).
Суммируя опыт разработки: эксперимент показал, что глубокое проникновение физики в геймплей технически реализуемо, но пока не слишком ясно, как это использовать с наибольшей пользой для геймплея. Нужно ещё разобраться, какие уникальные игровые фичи следуют из физического мира. Я сейчас работаю над кампанией для одного игрока, в которой пытаюсь задействовать необычные способы взаимодействия с миром, делаю эдакий гибрид «Леммингов» и платформера-стрелялки. В Леммингах надо было много копать, взрывать и строить, а в стрелялке — стрелять. Вот, посмотрим, какой гибрид у меня получится. Надеюсь, и игроки подскажут. В данный момент в опубликованной игре доступен только режим сражений, имитирующий игру Scorched Earth.
Цель этой публикации — поделиться с коллегами-разработчиками итогами этого эксперимента. Возможно, кто-то заинтересуется и захочет в своей игре тоже уделить физике побольше места. В комментариях наверняка будут спрашивать про страничку в Стиме, поэтому сразу её укажу.
Автор: ThisIsZolden