
Техническая реализация 3D-головоломки от первого лица про созерцание звезд

Логотип, модели Полины Дворянкиной Левел-арт Анны Чертовой
Меня зовут Александра, я работала программистом в проекте «Distant Suns» и здесь расскажу про код, нарратив и 2D-визуал игры.


Левел-арт Полины Дворянкиной
Наша игра о герое, который ищет дорогу к святилищу, ориентируясь по звёздам. Игрок должен использовать древние технологии, собирать созвездия и заряжать механизмы, чтобы узнать тайны погибшей цивилизации.
Взгляд главная тема игры
Основной геймплей построен на управлении взглядом. Важно фиксировать, куда смотрит игрок, поэтому каждый кадр от камеры вперёд бросается луч, который активирует интерфейс интерактивных объектов.
Интерфейс видимости
Основные интерактивные объекты
Чтобы код не превратился в кашу, для интерактивных объектов был создан общий интерфейс «видимости». При пересечении с лучом игровые объекты получают три сигнала: игрок увидел, игрок перестал видеть, игрок сфокусировался. На основе этого интерфейса было реализовано 4 типа интерактивных объектов: шар, линза, тьма и свет.
Версии билда с просмотра и предпросмотра
Шар изначально должен был иметь обычную физику: игрок поднимал его взглядом и мог бросить. Но физика движка конфликтовала с механикой взгляда. Шар должен был весить грамм при поднятии и тонну при броске, иначе он не поспевал за курсором или улетал в стратосферу. Но проблематичней была плавность перемещения, а точнее, её отсутствие. Точность луча, который взаимодействовал с шаром, сильно зависела от FPS. В поисках решения я случайно отключила шару гравитацию. Команде так понравился эффект невесомости, что мы решили его оставить — к тому же это исправило проблемы с физикой.


Версии билда с промежуточной и просмотра
Линза была первым и самым простым объектом. Смотря через неё, игрок фокусирует свет звезды и заряжает механизмы. В какой-то момент я предложила добавить механику превращения шара в линзу. Это разнообразило игровые ситуации и сделало систему более замкнутой.
Модели и левел-арт Полины Дворянкиной


Тьма и свет. Игре не хватало челленджей, а тема взгляда была раскрыта однобоко. Всё сводилось к вопросу «что, если смотреть на…». А что, если смотреть нельзя? Так в игре появилась тьма, наносящая урон, и целебный свет. Техническую сложность вызвала обратная связь, реализованная через тряску и зум камеры. Чтобы эффекты не накладывались и переход был плавным, две переменные типа float попеременно записывают уровень зума.
Вращение неба
Фишка игры — возможность вращать небо. Звучит просто: взять скайсферу, прикрепить звёзды и дать игроку вращать её по локальным осям с помощью WASD.


Скайсфера
Так я думала, пока всё не начало дёргаться и отказываться вращаться. Движок не поддерживает полноценное многоосевое вращение по локальным осям. Возникает риск слияния кватернионов — проще говоря, оси могут «склеиться», и программа не поймёт, как вращать объект. К тому же, небо должно двигаться относительно направления взгляда игрока, а не вокруг повёрнутой оси.
Билд с просмотра, предпросмотра и промежуточной
Если нельзя использовать локальные оси, сделаем свои. Вместо вращения по локальным осям, код теперь вращает скайсферу в мировых координатах, используя в качестве осей верхний и правый вектор камеры игрока.
Схема вращения неба вокруг векторов камеры
Оправы
Изначально в игре был всего один вид оправы, и он выполнял декоративную функцию. Позже команда решила добавить два новых вида: малая оправа для загадок с подбором ракурса и оправа, способная вытягивать из шаров звёзды, превращая их в линзы. Принцип проверки прост — от игрока в центр оправы выпускается луч; если он пересекает коллизию звезды, оправа активируется.
Малая оправа вызвала немало проблем, так как требовала проверки наличия звезды сразу в нескольких зонах, которые, в зависимости от ракурса, меняли своё положение и размер. Мне не пришло в голову ничего лучше, чем превратить оправу в «дробовик», когда игрок подходит достаточно близко. От взгляда игрока к оправе строится несколько лучей с разным оффсетом. Если хотя бы один луч пересекает коллизию звезды, оправа активируется.
Схема работы малой оправы
Нарратив


Левел-арт Анны Чертовой
Нам очень хотелось добавить в игру историю, поэтому я написала и разбросала по локациям дневники разных персонажей. Это добавило глубины и мотивировало игроков изучать локации.
Отрывок катсцены сделанной Анной Чертовой
Кроме этого, в игре есть два NPC с разными нарративными функциями. Путник погружает в сеттинг, даёт экспозицию и обучающие подсказки. Тогда как жрица двигает сюжет вперёд и подводит итоги.


Модель сделана по концепту Анны Чертовой, Система диалогов подготовлена Марией Товмой
2D Арт
Работая над нарративом, меня раздражало отсутствие визуального повествования, поэтому я нарисовала фрески и расставила декали, а чтобы выделить их в полумраке добавила эффект свечения и текстуру блеска через эмиссию. Так у игры нечаянно появился своеобразный 2D-стиль.


Наша команда
работа Полины Дворянкиной
Девлог