Anotherwords, демоверсия игры на Unigine

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

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

После нескольких итераций, вот что получилось:

Игра-эксперимент

В начале демо герой попадает на ландшафт с респавнящимися паукообразными врагами. В стандартном измерении можно стрелять (левая кнопка мыши) или (зажав правую кнопку мыши) двигаться ускорено, оставляя за собой геошлейф. Также здесь можно найти капсулы-сундуки, открывающиеся при нажатии E и дающие какой-либо “предмет”. Каждая “вещь” может выпасть случайной степени редкости (белая, синяя, зелёная, фиолетовая, оранжевая).

В качестве индикаторов “здоровья” персонажа используются слова (body/mind/hope). Когда один из индикаторов уничтожен, то героя выбрасывает на другую сторону (связанное измерение), где он оказывается заперт на какое-то время, пока показатели не восстановятся.

стандартное измерение
другая сторона
другая сторона

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

“Инвентарь” реализован, как дополнительное, карманное, измерение, куда можно перейти по нажатию Enter. Здесь можно увидеть полупрозрачную версию персонажа и звёздочки, отмечающие слоты “предметов” (или “достижений”) – сюда попадают полученные из капсул “вещи”.

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

Демоверсия

Видеонарезка с моментами геймплея из последней версии 01_05

Скачать демо для Windows 64-bit можно на страничке itch.io (около 230Мб в архиве): https://thenonsense.itch.io/anotherwords

Управление:

WAD – перемещение

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

E – открыть сундук

Enter – открыть/закрыть измерение “инвентаря”

мышь – управление камерой (колесо регулирует зум)

Левая кнопка мыши – выстрел (или применение вербального оружия на той стороне)

Правая кнопка мыши – быстрое перемещение (или бросок светильника на той стороне)

L – перезапустить мир

P – выход из приложения

О том, как что устроено

В Unigine engine предусмотрен встроенный инструментарий для относительно простого вывода плоскости с текстом в трёхмерное пространство – ObjectText. По сути узел-пустышка со специфическими текстовыми свойствами, доступ к которым из кода можно получить, представив полученную ссылку на узел as ObjectText (либо сразу получая ссылку в формате ObjectText’а, а не узла, если манипуляции со свойствами самого узла не понадобятся).

Далее, если хочется скрыть текст, то можно просто прописать “пустую” строку вместо отключения самого узла. Только конкретно в Unigine конструкция “” порождает визуальный баг, чтобы этого не было нужно внутри кавычек поставить пробел – ” “. Цвет текстового компонента задаётся через 4-вектор, где параметры RGBA выставляются значениями от 0 до 1 (хотя в самом редакторе цвет в этом формате не представлен, показывая вместо этого шестнадцатеричную запись, а также настройки цвета с диапазонами от 0 до 255).

Так как в проекте используется “переключение реальностей”, то для этого были сделаны некоторые слои с объектами, включаемые и отключаемые при надобности. Для того, чтобы некоторые вещи спавнились исключительно в нужном слое очень пригодился метод Clone(), так как клоны сразу создаются в той же ветке иерархии сцены, что и клонируемый объект. Более обычный метод – LoadNode() создаёт заранее сохранённый “префаб” сразу в сам мир. В принципе, почти в каждом игровом движке оба эти подхода присутствуют.

Что касается улучшения производительности для статических мешей – в Unigine предусмотрен такой способ оптимизации однотипной геометрии, как кластеры. Своеобразная папка с кучей инстансов одного и того же объекта, которые могут иметь разный наклон и скейл. Правда прицельно расставлять отдельные элементы средствами редактора – не совсем удобно, потому как если для точной привязки к координатам достаточно включить примагничивание и поставить мировые координаты вместо локальных, то при вращении элементов очень часто сбиваются углы на какие-то сотые и тысячные доли (то есть поворачиваешь элемент ровно на 90 градусов, а он время от времени сбивается на что-то вроде 89.999). Опять же, нет возможности выделить пачку объектов и ввести прибавку по нужной координате +N. Нужно именно вписывать конкретное число, что очень замедляет процесс, так как таким способом можно сдвинуть один объект или линию, но не больше.

третий уровень, собранный в Blender
третий уровень, собранный в Blender
9 уникальных элементов, из копий которых собран уровень
9 уникальных элементов, из копий которых собран уровень

Поэтому для сборки уровня под кластеры я пользовался Blender’ом, в котором можно куда удобнее и быстрее расставлять элементы. Таким образом, например, второй уровень собран из 3 расклонированных элементов, а третий из 9. Коллайдеры тоже можно было моделить сразу в Блендере, но тут уже разница была не так принципиальна, поэтому расставлял их уже внутри движка.

расстановка коллайдеров (слева), сборка враждебной "рыбы" (справа)
расстановка коллайдеров (слева), сборка враждебной “рыбы” (справа)
Больше картинок
закрытая капсула с "предметом"
закрытая капсула с “предметом”
персонаж собрал меч-ключ на той стороне
персонаж собрал меч-ключ на той стороне
эффект размытия при переходе между измерениями
эффект размытия при переходе между измерениями
третий уровень
третий уровень
карманное измерение "инвентаря"
карманное измерение “инвентаря”
чтобы снять печать нужно выбивать буквы у "потусторонних рыбок"
чтобы снять печать нужно выбивать буквы у “потусторонних рыбок”
второй уровень
второй уровень

Источник 📢