Subnautica Telemetry Library: от идеи до релиза

Доброго времени суток! Сегодня я расскажу, как я разрабатывал свой собственный мод на Subnautica, чтобы в ней была телеметрия персонажа игры.

Стоит начать с объяснения, что такое телеметрия. Тут хорошо подойдет пример с DiRT Rally 1.0 – игра о раллийных гонках по грязи, траве, грунту, песку, асфальту и т. д. на гоночных авто. Обычный игрок без примбамбасов просто играет и все – ничего не ощущает. Если используется геймпад, то есть вибрация. Это назовем первым уровнем погружения. Теперь добавим виртуальную реальность и кокпит: руль с педалями, коробкой передач и ручником. Что получаем? Мы получаем, что мы управляем виртуальным автомобилем как настоящим авто и можем видеть окружение как в реальной жизни. Это второй уровень.
И подошли к самому вкусному. Есть кокпиты на специальных установках, которые создают наклон сиденья в реальном времени в зависимости от того, что происходит с автомобилем. Это третий уровень. Но как установка понимает, что нужно делать и как делать? Игра отдает данные виртуального автомобиля. И вот эти данные и есть телеметрия! К примеру, обычно телеметрия есть в гоночных симуляторах таких как:

  • iRacing;
  • DiRT Rally;
  • Formula 1.

И немного про Force Feedback, который я уже даже затронул, когда говорил про геймпад и вибрацию. Force Feedback это то, как устройство себя ведет при получении данных телеметрии, к примеру:

  • вибрация геймпада;
  • адаптивные курки на геймпадах PS5;
  • сопротивление руля.

Теперь история. Работаю я в компании Teslasuit, которая занимается разработкой костюма виртуальной реальности. Несколько моих коллег сделали аддоны к играм, чтобы события, что происходят в игре, чувствовались игроком в костюме. До этого я уже пробовал делать для одной игры плагин на C++ с использованием SDK игры. Потом я задумался к какой игре я бы хотел сделать еще что-то подобное. N-ое время спустя мой коллега показал мне эффект погружения в воду и у меня стрельнуло – Subnautica! Было бы интересно запилить что-то такое для такого необычного выживача, ведь это выживач под водой! 5-го декабря 2022-го года я начал работать над модом.

Вводные данные были следующие:

  • игра на базе игрового движка Unity;
  • есть инструменты для разработки модов и их загрузки в игру;
  • есть документация ко всему необходимому;
  • код игры можно посмотреть через программу dnSpy;
  • есть желание и интерес.

При этом C# я не трогал несколько лет, модификации к играм на Unity я не писал никогда. Но кого это остановит? В первую очередь пришла идея, что раз это выживач под водой, то игрок должен чувствовать давление воды. Начало идеи положено, вперед и с песней! Немного про архитектуру проекта, чтобы было немного понятнее.

Начну с патчей. Патчи внедряются в игру, а именно в классы в коде игры. Конкретно в данном случае я добавил дополнительный код, который выполняется после некоторых методов пропатченных классов (или функций, если так будет проще). К примеру, в PlayerPatches есть патчи для методов “Update” и “OnTakeDamage”, в первом происходит обновление параметров персонажа, во втором – обработка полученного урона. И за счет патчей мод на лету получает необходимые параметры и состояние игры. И все это отправляется в Data Processor, который обрабатывает все полученные данные и запаковывает их в Force Feedback Event, содержащий в себе тип события, мощность (от 0% до 100%), является ли событие повторяющимся и позицию источника события, что может использоваться в событии с типом Damage, чтобы понимать откуда пришел урон. Далее эти ивенты куда-то должны ведь отправлены? Вот тут и появляются Force Feedback Processor’ы, которые являются реализацией интерфейса IForceFeedbackProcessor, занимаются обработчики тем, что обрабатывают полученные ивенты от Data Processor’а и отправляют инструкции, что делать устройству.

Вот такой набор исходников у меня был уже 7-го декабря. Как я выше уже писал, есть интерфейс IForceFeedbackProcessor. Возникает вопрос: зачем тебе интерфейс, если у тебя по идее будет только одна реализация под Teslasuit? Я хотел еще сделать Force Feedback Processor, который писал бы все лог. И в целом интерфейс позволяет сделать несколько реализаций. И именно в этот момент появилась идея: а что, если сделать несколько модов, то бишь главный мод и вторичные моды. Главный мод для внедрения в игру, обработки данных из нее и отправка обработанных данных. В свою очередь вторичные моды принимают эти обработанные данные и содержат реализацию IForceFeedbackProcessor под конкретное устройство. Разделяй и властвуй! Таким образом появляется возможность подвязать совершенно разные устройства к этому моду. И как можно догадаться, первой реализацией стал мод, который пишет в лог переваренную первым модом информацию.

На этом этапе у меня были следующие эффекты:

  • давление воды;
  • отсутствие кислорода.

Все эти данные можно достать из объекта класса Player, который содержит в себе информацию на какой глубине находится персонаж игры и сколько кислорода доступно. От эффекта “отсутствие кислорода” мои коллеги посмеялись, но я решил, что пусть будет для полного погружения в игру. Да и можно этот эффект отключить, но об этом чуть позже.

Также был момент, что надо как-то понять, что игра стоит на паузе. Изначально я думал ловить момент, что открывается меню, но хотелось бы иметь совместимость с модом, который ставит на паузу мир, когда игрок открывает КПК. В итоге я полез в исходники этого же мода и нашел, что есть класс FreezeTime. К нему я и подвязался, в итоге во время паузы обработчик данных встает на паузу и останавливает все проигрываемые ивенты в Force Feedback Processor’ах. Отлично, если что-то пойдет не так, всегда можно встать на паузу и перенастроить мод.

И кстати на счет настроек. Что такого можно сделать в таком базовом моде, который предоставляет данные телеметрии персонажа? О, а ведь можно что-то отключать, чтобы можно было конфигурировать Force Feedback под себя. Так я и сделал.

Настройки мода в релизной версии

Иии… 14-го декабря я обнаруживаю, что Subnautica обновилась до версии 2.0, моды перестают работать, так как они под старую версию игры. Проблема была еще в том, что мой мод зависел от других вспомогательных модификаций: QModManager и SMLHelper. Я наблюдал за обновлением SMLHelper, но новой версии на GitHub все не было и не было… От QModManager вообще отказались в пользу формата плагинов для BepInEx. В итоге 18-го марта я в Discord-сервере по модификациям Subnautica узнаю, что SMLHelper давно обновлен, новая версия есть на NexusMods, ее просто не залили на GitHub. Эмоции меня обуревали разные, но речь не об этом. Я снова сел писать мод.

Первым делом я все адаптировал под новый формат и под новую версию игры, ничего сверхъестественного в этом этапе не было. Далее дописал обработку урона, которую я снова подвязал к Player’у, дописал обработку голода и обезвоживания, которую я уже подвязал к объекту класса Survival. Если с уроном все понятно, человек должен чувствовать боль, то с голодом и обезвоживанием что? В моем понимании это урчание живота, можно игрока дергать за пресс. Но к сожалению, пока фича с голодом и обезвоживанием не работает. С моей точки зрения прикольная может получиться штука. Также я обнаружил баг, что некоторые ивенты зацикливались и приходили тогда, когда не надо. Все было из-за параметра Replay, смысл которого я, внезапно, забыл, так как я уже не понимаю зачем он, если игра сама даст необходимую информацию что и куда. Replay больше подходит для реализации вторичного мода под устройство, нежели для базового мода, скорее всего это осталось еще с того момента, когда я еще думал все сделать в одном моде.

Лог телеметрии

В итоге, мод написан и “готов к труду и обороне”. Я его выложил поздно вечером 23-го марта. Да, вот так я быстренько написал мод. Но мод сам по себе небольшой и не сильно сложный в сравнении с другими, тем более он не содержит в себе никакой реализации, это просто база для других модов. Поэтому он и был назван Subnautica Telemetry Library. Сейчас модификация доступна для скачивания на NexusMods, а также на GitHub можно найти исходники. Надеюсь, что сия библиотека потом даст возможность в будущем игрокам прочувствовать все то, что на себе ощущал персонаж игры Subnautica, хоть сейчас это и не востребовано. Если у вас есть идеи по этой модификации или хотите ее обсудить, то добро пожаловать в комментарии. Спасибо за внимание!

Следите за нами в сети:

Поделиться записью
Комментарии 0

Комментарии