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