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

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

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

В начале демо герой попадает на ландшафт с респавнящимися паукообразными врагами. В стандартном измерении можно стрелять (левая кнопка мыши) или (зажав правую кнопку мыши) двигаться ускорено, оставляя за собой геошлейф. Также здесь можно найти капсулы-сундуки, открывающиеся при нажатии 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
9 уникальных элементов, из копий которых собран уровень

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

расстановка коллайдеров (слева), сборка враждебной "рыбы" (справа)
Больше картинок