Лучшие практики для запуска вашей игры на Unity в Steam Deck
Джош Стейнхауэр-Ли присоединился к нам, чтобы обсудить сложности оптимизации инди-ролевой игры в духе Elder Scrolls — Ardenfall — для Steam Deck, а также внедрение поддержки контроллеров. Он также поделился ценными советами.

Сначала расскажите немного о себе, своём опыте и кратко представьте игру!
Я — Джош Стейнхауэр-Ли, геймдевелопер, начавший свой путь во времена Adobe Flash. Сейчас я довольно много времени уделяю разработке в Unity как профессионально, так и в качестве хобби. Я — ведущий разработчик игры Ardenfall, ролевой игры с открытым миром, ориентированной на свободу действий игрока и вдохновлённой такими играми, как Morrowind и Fallout New Vegas.
Недавно мы выпустили обновление контроллера для демо-версии Ardenfall, которое позволило игре запускаться на Steam Deck. Это ранний взгляд, и мы многому научились как в процессе разработки, так и на основе отзывов игроков!


С какими специфическими техническими и UX-задачами вы столкнулись при реализации ввода с контроллера, особенно для систем, изначально созданных под клавиатуру и мышь?
Первая трудность заключалась в том, чтобы сделать игровой процесс удобным на контроллере — основной проблемой были прицеливание и обзор, требующие баланса скорости и точности. Наше текущее решение — кривая прицеливания, которая делает медленные движения джойстика медленным поворотом камеры, а быстрые — быстрым. Это даёт игрокам точность, когда она нужна, но также позволяет быстро поворачивать камеру, когда это необходимо.
Однако основной трудностью оказался пользовательский интерфейс. Каждый элемент должен «соединяться» с другим, позволяя игроку плавно перемещаться. Каждая кнопка должна быть привязана к контроллеру или вводу с клавиатуры. Теперь нужно было сообщить о выборе. Когда пользователь нажимает на список, список должен автоматически прокручиваться. Так много деталей!
Взаимодействие с элементами пользовательского интерфейса должно быть хорошо продумано:
Автоматическая прокрутка:
Нам также пришлось заменить все выпадающие меню на прокручиваемые!
Ещё одной сложностью в некоторых местах было подавление ввода. На контроллере вы можете использовать кнопки направления во время игры для запуска различных вводов, таких как открытие карты. Но как только вы подойдёте к ящику, вам нужно будет использовать крестовину для навигации по меню! Наше решение — отключить все использования крестовины, когда появляется это меню.
Когда появляется меню быстрого лута, крестовина используется для навигации по меню:
Ещё одной трудностью было обеспечение поддержки переназначения контроллеров и клавиатур. Во время этого обновления мы перешли со старого менеджера ввода Unity (который опирался на нашу собственную версию переназначения) на «новый» ввод Unity. Вместе с этим пришли новые ограничения, но и новая гибкость. Система ввода поддерживает встроенное переназначение с помощью метода PerformInteractiveRebinding.
Наша настройка карты действий с использованием «новой» системы ввода Unity:

Меню переназначения Ardenfall:

Когда вы добавили поддержку контроллера, были ли какие-то основные игровые системы (меню, прицеливание, движение), которые требовали переосмысления или redesign, чтобы чувствовать себя естественно на аналоговых стиках и геймпадах? Как вы это решили?
Было несколько меню, в которых нужно было хорошо продумать взаимодействие. Торговое меню было самым напряжённым — два инвентаря рядом друг с другом, с возможностью переключения категорий и передачи предметов. Это легко на клавиатуре и мыши, но с контроллером нам пришлось добавить систему «фокуса», позволяющую игроку переключаться между каждым меню, чтобы затем манипулировать им.
Переключение фокуса между двумя инвентарями:
Ещё одной вещью, которую мы должны были пересмотреть, были всплывающие подсказки — у многих элементов пользовательского интерфейса изначально были значки, на которые можно было навести курсор, чтобы найти дополнительную информацию. Мы заменили эти подсказки простым отображением дополнительной информации, что оказалось отличным решением и для игроков на ПК, поскольку выяснилось, что многие игроки вообще не наводили курсор на информацию.

Поддержка такой платформы, как Steam Deck, часто требует учёта как производительности, так и соображений пользовательского интерфейса и UX. Какие методы оптимизации (рендеринг, LOD, масштабирование качества и т. д.) вы использовали или планируете использовать, чтобы обеспечить плавную работу на портативных устройствах?
В Ardenfall используется множество техник для обеспечения плавного хода игры — с самого начала мы хотели, чтобы эта игра запускалась на маломощных устройствах.
Наш мир разделён на ячейки, при этом 3x3 сетка ячеек всегда активна вокруг игрока. Чтобы добиться больших расстояний рендеринга, мы создаём «далёкие ячейки». Это упрощённые версии каждой ячейки в игре, со всеми столкновениями, большинством скриптов и всеми небольшими объектами, удалёнными. То, что остаётся, — это очень лёгкий и простой объект, который мы можем активировать на расстоянии.
Наш ландшафт также упрощается на расстоянии, а карта наложения запекается в единую текстуру. Пример уменьшения ландшафта:

Обычная ячейка (1306 полигонов) по сравнению с дальней ячейкой (219 полигонов):
У нас также есть система автономного ИИ, которая позволяет NPC имитировать свою работу, даже не существуя на самом деле. Как только игрок подойдёт достаточно близко, они появятся, как если бы существовали всё это время! ИИ в целом также масштабируется по частоте обновления, в зависимости от того, насколько близко они находятся к камере.
Одной из больших затрат в Unity (и ещё хуже на Steam Deck) являются рендереры скинов. Это сетки, которые могут быть преобразованы с помощью костей, обычно используемые для персонажей. Мы автоматически объединяем сетки скинов, когда это возможно, используя Unity Jobs (многопоточность), чтобы персонажи были максимально оптимизированы. Это может превратить целый набор доспехов из 5 скинов в 1!
Этот набор доспехов обычно состоит из 5 частей и объединён в 1:

Говоря об интерфейсе, многие клиенты, созданные для настольных компьютеров, страдают от крошечных элементов пользовательского интерфейса или проблем с навигацией на портативных экранах. Какие уроки из UI/UX-дизайна вы применили, чтобы меню, инвентарь и текст были удобны для игры на экране Deck?
Мы быстро поняли, что некоторые элементы нашего пользовательского интерфейса были слишком маленькими, и начали делать некоторые элементы крупнее. Мы начинаем формировать некоторые правила относительно наименьшего размера текста, наименьшего размера кнопок и так далее, чтобы обеспечить согласованность работы как на ПК, так и на Steam Deck.
С технической точки зрения, как вы обрабатываете обнаружение ввода и переключение между контроллером и клавиатурой/мышью — особенно в Unity? Вы создали собственные системы для резервной логики навигации или полагались на подсистемы Unity/Steam Input?
Мы создали систему, которая определяет последнее использованное устройство и динамически обновляет режим ввода и глифы при каждом изменении ввода. Каждый кадр мы опрашиваем каждое устройство — для клавиатуры мы читаем anyKey, а для контроллера мы вручную опрашиваем каждую кнопку ввода. Если устройство не обнаружено, мы возвращаемся к клавиатуре и мыши на ПК и контроллеру Steam на Steam Deck. Это было создано на основе Unity Input.
Мы также убедились, что отключение контроллера приводит к паузе игры, это фактически требование Steam, чтобы отметить вашу игру как поддерживающую контроллер!
Аппаратное обеспечение Steam Deck может различаться по производительности по сравнению с настольными ПК. Как вы подходите к профилированию производительности и оптимизации? Есть ли определённые системы движка или типы контента, которые вы приоритизировали для настройки на портативных устройствах?
Наш конвейер профилирования довольно прост — загрузка сборки разработчика во внутреннюю ветку Steam и использование профайлера Unity по сети для сбора данных о кадрах. Поскольку мы нацелены на довольно бюджетные ПК, разница между Steam Deck и ПК с точки зрения производительности незначительна, вместо этого основное различие заключается во времени работы от батареи и тепловыделении, что делает его похожим на мобильное устройство.
Время работы от батареи и тепловые ограничения на портативных устройствах важны. Реализовали ли вы (или рассматривали) динамическое масштабирование качества, ограничение кадров или специальные пресеты для устройств, чтобы обеспечить стабильную производительность на таких устройствах, как Steam Deck?
Более низкие разрешения и особенно ограничение кадров — это, безусловно, самый простой способ увеличить время работы от батареи. Я сталкивался с этим в прошлом с мобильными играми в Unity, это на данный момент самый большой ограничитель графической точности на мобильных устройствах. Конечно, вы можете сделать игру красивой, но не сожжёт ли она ваши руки или не израсходует ли батарею?
На данный момент мы ожидаем, что игроки будут настраивать параметры по своему усмотрению, но мы планируем добавить специальный пресет «Steam Deck» для графики, чтобы обеспечить хороший начальный опыт, а также режим экономии заряда батареи, который ограничивает частоту кадров до 30 FPS и снижает разрешение!
Мы также планируем подключить функцию динамического разрешения Unity, которая позволяет нам снижать разрешение, когда частота кадров падает. Это особенно полезно на Steam Deck, поскольку снижение разрешения менее заметно на портативных устройствах.
Поддержка контроллера выходит за рамки простого сопоставления кнопок и включает в себя такие вещи, как глифы значков, радиальные колёса, текстовая навигация и контекстные подсказки. Какие инструменты или подходы вы используете, чтобы пользовательский интерфейс эффективно взаимодействовал независимо от метода ввода?
При добавлении поддержки контроллеров мы действительно реализовали несколько типов глифов, обновили все кнопки меню для отображения глифов и добавили контекстные панели для навигации по меню.
Некоторые глифы пришлось интегрировать в текст, используя динамически назначаемый лист спрайтов TextMeshPro.

Контекстные панели необходимо использовать практически в каждом меню.

В нашей игре используются быстрые слоты для использования предметов с помощью клавиш 0–9, поэтому мы добавили колесо быстрых слотов для удобного переключения между предметами. Это оказалось очень полезным и для игроков на ПК, поскольку нажимать клавишу 0 на клавиатуре неудобно.
Одна маленькая хитрость, которую мы сделали, — присвоили первому предмету в быстром слоте привязку по умолчанию для контроллера и убедились, что все быстрые слоты, имеющие привязку, будут правильно отображаться в пользовательском интерфейсе. Это даёт игроку полную возможность привязки по своему усмотрению.
Какими были самые неожиданные ожидания игроков или отзывы относительно поддержки портативных устройств/контроллеров во время демонстрации на Steam Next Fest и как это повлияло на ваши приоритеты в разработке?
Многие игроки столкнулись с проблемами управления на Steam Deck, хотя многие в целом похвалили поддержку контроллера. Мы планируем внести значительные изменения в настройки управления по умолчанию для Steam Deck, чтобы убедиться, что они работают корректно!
В будущем планируете ли вы официально оформить оптимизацию для Steam Deck/портативных устройств как часть вашего текущего конвейера разработки? Какой совет вы могли бы дать другим независимым разработчикам, приближающимся к аналогичной поддержке игр на Unity?
Мы планируем проделать гораздо больше работы со Steam Deck, этот первый этап был только началом! Мы планируем официально поддержать Steam Deck для раннего доступа к Ardenfall.
Что касается советов, то самое очевидное — это приобрести Deck, если у вас его ещё нет. Невозможно создать хороший опыт без его физического тестирования. Во-вторых, пусть игроки тестируют его и дают обратную связь. Я сам не любитель контроллеров, поэтому я во многом полагаюсь на других игроков, которые говорят мне, что хорошо, а что плохо. Обратная связь имеет огромное значение!
Также отличной идеей будет хотя бы держать поддержку контроллера в уме при реализации пользовательского интерфейса, если вы хотите в конечном итоге её поддержать. Избегайте всплывающих подсказок, когда это возможно, и продумывайте навигацию. С контроллерами может быть сложно работать, особенно из-за их серьёзных ограничений по сравнению с клавиатурой и мышью. Но в наши дни игроки, похоже, ожидают поддержки даже в Steam, а теперь Steam Deck — это серьёзный повод задуматься о добавлении поддержки, кто же не захочет играть в вашу замечательную игру в автобусе или в постели?
Джошуа Стейнхауэр-Ли, руководитель проекта и программист в Ardenfall
Интервью провёл Дэвид Ягнео
Вы поклонник того, что мы делаем здесь, в 80 Level? Тогда обязательно установите нас в качестве предпочтительного источника в Google, чтобы видеть больше нашего контента в своей ленте.
Автор: Josh Steinhauer-Li
Материал подготовлен на основе статьи 80.lv. Перевод — Skills Up.