Кажется, контроллеры сломают меня быстрее, чем я их
Краткий пересказ всей статьи: «поначалу я не любил контроллеры, затем я полюбил контроллеры, но любовь не оказалась взаимной».
Осторожно! «Контроллер» - слово-паразит данной статьи.
Сперва….
…длительное время я сторонился использования контроллеров, предпочитая альтернативный вариант взаимодействия с игрой, даже если она настаивала на том, что играть с контроллером в неё удобнее. Даже Super MeatBoy я целиком прошёл на клавиатуре, со всеми тёмными мирами и варп-зонами, и, если верить надписям на стартовых экранах этой игры, МакМиллен не считает меня адекватным человеком. Усугубило ситуацию то, что лет 6 назад мне предложили взять в руки контроллер и поиграть в некоторую игру, название которой я не запомнил. Чёрно-белый адреналиновый платформер, который не оказался мне под силу. Вероятно, следовало пытаться в него играть с самого начала, а не посреди прогресса какого-то другого игрока, но выбора мне не дали.
Соответственно, себе контроллер для личных нужд не покупал за ощущением ненадобности.
Но однажды…
…я рассматривал документ, описывающий возможности движка, на котором я работаю, и перечитал список команд для взаимодействия с контроллерами. Почесав затылок, подумал, что, быть может, в качестве эксперимента было бы любопытно попробовать подключить какой-нибудь к движку и управлять своей игрой через него. Одолжив на время у друга контроллер от Xbox One, я начал заставлять движок принимать сигналы от этого чуда.
Следует отметить: это не мой самописный движок, это также не крупный популярный движок, не Unity и не UE, это весьма скромный инструмент для написания кода, с последующей его компиляцией, который в настоящее время уже лишён официальной поддержки. Основная проблема данного положения в том, что движок предоставляет конкретные возможности в границах его инструментария. Инструментарий немаленький, но и не безграничный. И если какой-либо команды там нет, значит - всё. Выйти за рамки инструментария не невозможно, но самостоятельно для этого нужно очень глубоко погружаться, потратив на это немало времени и сил, чего я не могу себе позволить, а тех, кто этим занимался, чьи труды я мог бы позаимствовать, в мире не так уж и много.
Исходя из этого, я на тот момент оказался в положении, когда у меня перед глазами есть конкретный список команд, которыми я могу пользоваться. Ни больше, ни меньше. Если их окажется достаточно для того, чтобы внедрять возможность управления от контроллера в свои игры – значит, окажется. Иначе = иначе.
Внезапно что-то заработало. Я подумал: «Вероятно, будет весьма неплохо добавить возможность управления игрой с помощью контроллера, ведь лучше когда она есть, чем когда её нет». Допуская, что данное решение может мне в дальнейшем аукнуться из-за отсутствия опыта как игрока, так и разработчика, я решил рискнуть. Экспериментально выявив какой элемент устройства, каким сигналом манипулирует, организовал в движке систему, обеспечивающую приемлемое взаимодействие: реакции на коннект, дисконнект, слепые зоны, актуальный сбор, распределение и обработку сигналов и бла бла. Простыми словами, сделал так, что можно было удобно пользоваться контроллером как разработчику. Затем я добавил всё это в свою игру, которая через несколько месяцев должна была отправляться в релиз.
Разумеется…
…проблемы не заставили себя долго ждать. Они начинали проявляться в разные моменты, но основной список того, что обнаружилось до релиза, следующий:
1) Различные протоколы. Каждый канал может передавать значение только одного элемента контроллера, будь то кнопка, крестовина, триггер или ось стика. Проблема в том, что некоторые каналы передавали значения разных элементов, в зависимости от неизвестных условий. Отличия небольшие, но их наличие, в любом случае, плохой знак. Экспериментально выявилась зависимость от способа подключения (шнур – один протокол, блютуз - другой), а также от самого ПК. Обновление Windows актуальной версией решило эту проблему. (один из редких случаев, когда они в чём-то помогли)
2) При блютуз-соединении периодически возникали подвисания, инпут-лаги. Обращаешься к команде, а она буквально возвращает тебе из канала старое значение. Экспериментально выявилась зависимость от нагрузки на процессор. Помогали дополнительные задержки внутри алгоритма, где применимо, однако не всегда и не все разновидности оказывали влияние. Пробовал запоминать все каналы и при их длительном повторении оказывать дополнительные задержки, но это крайне костыльно, помогало раз через раз, чаще мешало. В итоге от идеи отказался и эта проблема преследует меня до сих пор.
3) Возможность подключения нескольких контроллеров. Это хорошая возможность для кооператива, которую движок позволяет реализовать. Но при подключении нового \ отключении старого устройства, список реорганизуется, а поскольку к различным контроллерам я обращаюсь по индексу, сходу трудно выявить, какой был добавлен, а какой пропал. Благо кооперативные игры я пока не делал. (хотя это было бы любопытно)
4) Нет никакого сигнала, который мог бы давать описание контроллеров. Есть только информация о том, поддерживают ли они аналоговые сигналы, но этого недостаточно, ведь, насколько я могу судить, почти все частоиспользуемые контроллеры их поддерживают. Из этого следует, что движок будет одинаково работать с любым устройством, которое системой будет выявлено как «контроллер», вероятно даже если оно фактически им не будет. И нет никакой «этикетки», по которой можно было бы это подтвердить или выбрать, какая из разновидностей контроллера была подключена.
Любая из этих проблем способна при определённых условиях насолить. Однако добившись стабильной работы при собственных, я почему-то решил, что как «необязательная, но возможность» нужно, чтобы в игре она была.
Недостаточно…
…просто обрабатывать сигналы и заставлять от них персонажа двигаться. Нужна адаптация всей игры. Чтобы в конечном результате соблюдались все тайминги, акценты и приоритеты, а внимание распределялось и концентрировалось концептуально схожим образом.
Редко, когда игра воспринимается одинаково при разных форматах управления, но если значительная разница между ними не подразумевается автором, необходимо что-то с этим делать.
Потратив какое-то количество усилий, я постарался как можно сильнее сгладить идейные и технические углы, и отправил игру в релиз. Понимая, что в будущем могут проявиться новые проблемы, о которых я не знал, решил, что если у кого-то из игроков возникнет аномалия, которую я не смогу объяснить или контролировать, – вероятнее всего, придётся вырезать возможность использования контроллеров как таковую.
Это и случилось.
Внезапно…
..начали появляться сообщения от некоторых игроков, что после запуска игры камеру сносит в сторону. Резко и резво, а попытки её выровнять просто продолжают уносить её далеко.
Понимая, что алгоритмически камера может управляться только либо сигналом мыши, либо сигналом дополнительного устройства, входящего в список контроллеров, я делаю вывод, что к ПК игрока подключено некоторое устройство, что отправляет сигнал, постоянно нокаутирующий камеру. Также понимая, что я не готов в ближайшее время плотно погружаться в эту тему, а также в виду отсутствия каких-либо контроллеров рядом, поскольку прошлый я уже вернул, я принял факт, что не смогу своевременно решить этот вопрос.
Я вырезал возможность подключения контроллеров, чтобы она не вызывала у игроков проблемы и убрал со Steam-страницы значок «Контроллер (полностью)» до лучших времён.
С тех пор...
…прошёл год. Возможность управления контроллерами я до сих пор не вернул, поскольку после релиза, задолго до обнаружения проблем, я сразу же погрузился в разработку следующей игры. Составив себе список задач на ближайшие месяцы, я вошёл в поток, и внезапные проблемы, требующие погружения и дополнительной аппаратуры – не то, чему я был готов посвятить время.
Спустя месяцы – релиз второй игры, к которому я чувствовал, что всё ещё не созрел для решения этой проблемы. Предрелизный период с последующими несколькими неделями в принципе были обеспечены необходимостью решать более приоритетные задачи.
После я ушёл отдыхать.
А затем… я наконец-то купил его себе. Для личных и экспериментальных нужд. Мой собственный контроллер. Вновь Xbox.
Перво-наперво убедился, что он коннектится со всем, с чем бы я хотел его законнектить. И последующие месяцы плотно нарабатывал опыт. Наполнял собственную библиотеку знаний деталями и нюансами того, что же это такое, как он ощущается, где и как применяется.
Простым языком – играл в игры. Перепроходил старые любимые, погружался в новые неизведанные. Наконец-то прошёл Death Stranding, в который принципиально отказывался играть на клавомыши (вот до чего контроллерская секта меня довела).
Частично из-за этого я долго не публиковал статьи, и разработка третьей игры заняла куда больше времени по сравнению с изначальными планами.
В действительности всё это важно и необходимо для большего понимания того, каковы гласные и негласные стандарты и для формирования необходимого мышления для дальнейшей разработки.
Приступая за разработку третьей игры, я уже понимал… что-то. Затем месяцы отняла сама разработка. Ближе к её концу на этапе внедрения контроллерного управления начал искать другие варианты устройств для тестов. Целью стали контроллеры для PS4, PS5 и Nintendo Switch. Первый был найден.
Как ни удивительно…
…именно PS-контроллер способен нокаутировать камеру. Не факт, что только он, но он в том числе.
Хорошо, когда баги возникают не где-то далеко при неизвестных условиях, а у тебя на столе – сразу лучше понимаешь причинно-следственные связи. Следовало озаботиться этим раньше, но теперь уже очевидно: каждый тип контроллера имеет свой протокол передачи данных. Каналы, по которым Xbox-контроллер передавал положение правого стика по осям X и Y, предназначены в PS4-контроллере для триггеров. Всё это вылилось в картину, где триггеры регулировали вращение камеры, и если их не трогать - камеру постоянно вертит.
Это не единственные различия. Кнопки передают сигналы иначе. Среди сигналов сенсорной панели Dualshocka, хоть и не видно движений по панели, но видно нажатие на неё. Триггеры в Xbox-контроллере передаются одним каналом, из-за чего одновременное их зажатие равносильно одновременно отжатым. В PS4-контроллере информация о триггерах передаётся по четырём каналам, следовательно, каждый триггер можно обрабатывать независимо друг от друга.
Адаптировать под новый протокол легко, но неизвестно ни то, сколько разновидностей таких протоколов существует, ни то как программным образом определить, какой из контроллеров используется.
Найти Dualsense и Switch Pro Controller не вышло. Купить их в ближайшее время нет адекватной возможности, потому пока что уповаю на то, что хотя бы протоколы Dualsense, такие же как и у Dualshock. Подружить джойконы от Nintendo Switch с движком не получилось. Так что пока довольствуюсь тем, чем могу.
Почему-то именно в последние месяцы я чаще натыкаюсь то на рекламу, то на истории свидетельствующие о существовании контроллеров от каких-то неизведанных мне компаний, словно высшие силы намекают мне оставить идею с их освоением. Ну или эти рекламы всегда вокруг были, а я не обращал внимания.
Решения…
…к которым я на данный момент пришёл, следующие.
Игра начнёт учитывать факт существования контроллера только если в течение пары секунд все его каналы находятся в дефолтном положении. Таким образом, уменьшается риск подключения чего-то, что заставит улететь персонажа в космос. Правда из-за потенциального дрейфа стиков или каких-либо ещё проблем, есть шанс неподключения контроллера, но это, возможно, игроку лишь во благо. Этот способ не даёт гарантии, ибо дефолтные положения всегда можно просто выдержать, но как мера безопасности, почему бы и нет. К тому же из-за разницы в протоколах можно определять какой контроллер был подключен, PS или Xbox, поскольку у каждого из них свой дефолтный набор. Костыльно, но в теории должно работать, если протоколы контроллера соответствуют.
Меня до сих пор тревожит, что я не могу определить ни необходимость считывания сигналов с подключенного устройства, ни точный его тип. Потому при обнаружении игрой контроллера, теперь выскакивает окно, с помощью которого игрок может выбрать то, что ему нужно.
Это обезопасит от ситуаций, в которых игра потенциально может обнаружить устройство которое игрок не подразумевал использовать, либо которое не подразумевалось быть контроллером, а также позволит игроку выбрать тип, чтобы игра точно знала, какому из протоколов следовать. Тут же можно сразу убедиться, что все элементы управления работают как полагается.
К сожалению, возможно, этим окном придётся пользоваться только мышью, чтобы не допустить ложной активности и проблем с тестом устройства. Или изворачиваться. В конце концов у обоих контроллеров одинаково работают крестовина, левый стик и верхняя кнопка.
В любом случае есть плашка «Больше не показывать», чтобы перекладывать руку на мышь больше никогда в жизни не приходилось …хотя поговаривают, что для некоторых игроков это проблема, в виду наличия у них контроллерного управления и отсутствия мышного.
Всегда в меню настроек можно будет уточнить уведомления, игнорирование и регулировать размер слепой зоны. Однако я так и не решил, стоит ли организовывать систему таким образом, чтобы можно было настраивать клавиши управления для контроллеров.
Насколько я могу судить, немногие игры её обеспечивают. Даже многие игры, издаваемые Microsoft, не позволяют выбирать какие клавиши за какое действие отвечают.
К тому же это неудобно организовывать, учитывая функциональные особенности контроллеров. Переключить с одной кнопки на другую или на бампер – не проблема. Но переключить на триггер или на движение стика – другое дело. Также в случаях если крестовина изначально подразумевает выбор направления – возможность переключения её куда-либо вызовет новые трудности в организации системы. Это не невозможно, но маловероятно, что оно того стоит.
Потому сейчас будет наиболее важный для меня опрос (для большей видимости, стоило его поместить в начало статьи, но уже поздно). Этот вопрос у меня давно стоит и я окончательно не уверен, в какую сторону двигаться. Мне было бы намного проще этим не заниматься, сделав клавиши неизменными. Тем не менее, допускаю, что некоторым игрокам это может облегчить жизнь.
Статья…
… изначально планировалась к публикации сразу после того, как внедрю всё это в уже выпущенные игры под лозунгом «Смелее! Оцените сами». Однако, как можно предположить по количеству местных опросов, я не уверен в самой возможности. И не уверен, что в моих условиях её можно довести до идеала. Неоднократно из-за возникающих сложностей мне хотелось просто всё прекратить, оставив идею с контроллерами, как таковыми, позади.
Но каждый раз возвращаюсь. Потому что каждый раз чувствуешь, как та или иная игра начинает ощущаться по-новому. Особенно, когда применяешь эту технологию на собственных играх. Это непередаваемое ощущение, когда ты в течение длительного времени пробуешь создавать некоторое произведение, в которое вкладываешь идеи, маленькие и большие, анализируя то, как может и будет восприниматься тот или иной элемент при тех или иных условиях ..а потом подключаешь к нему контроллер, и твой спектр восприятия резко меняется. Моментально начинаешь видеть новые преимущества, недостатки, возможности, нюансы, перспективу, что, в любом случае, способно позитивно отразиться как на самой игре, так и на тебе.
С другой стороны, до более плотного (и хоть какого-то) знакомства с контроллерами, я, можно сказать, жил в неведении, сосредоточившись на аспектах, которые были мне на тот момент приоритетны, заключённых в некоторую ограниченную картину мира. И этот мир мне казался целостным и по-своему прекрасным. Контроллеры разрушили его. Они показали мне, сколь я ограничен, несовершенен, недальновиден и сколь погряз в своей системе ценностей. Некоторые мои старые игры крайне трудно организовать так, чтобы обеспечить их адекватным управлением с помощью контроллера просто потому, что они создавались в то время, когда даже само существование контроллеров как факт меня не заботило. Это привело к довольно жёсткой привязке к клавомышному формату взаимодействия. Взять какую-либо игру и заставить её принимать сигналы от контроллера несложно. Но мы же хотим, чтобы с точки зрения дизайна управление воспринималось адекватным, целостным, легковосприимчивым, а не наспех добавленным для галочки (что я, грубо говоря, сделал с первой игрой, но даже там я старался).
С третьей стороны, жёсткая привязка к тому или иному формату как ограничивает вширь, так и обеспечивает пространством для развития вглубь. Этим можно воспользоваться, чтобы сделать что-то более уникальное, что было бы невозможно реализовать при других форматах. Однако для этого нужно хорошо понимать преимущества и недостатки по сравнению с другими, что в любом случае обязывает разработчика хорошо разбираться в разных форматах взаимодействия с играми.
С четвёртой стороны, да какая вообще разница. Люди развиваются, и это хорошо. Познают новое и делают выводы, пересматривают позиции и расставляют иначе приоритеты с акцентами. Всё вышесказанное лишь мой слепок мыслей, основанный на опыте взаимодействия с этими чудо-устройствами, которые я в своё время недооценил.
И теперь..
..вероятно, я не буду внедрять возможность управления контроллером в каждую первую свою работу. Если я этого не сделаю, значит либо работа весьма незначительна, либо концептуально она подразумевает иной формат взаимодействия, либо сторонние ограничения, например, моё неполное понимание принципов работы движка или джемы.
Я до сих пор испытываю трудности с попыткой адекватно подключать их к своим играм, и их будущее на текущем движке, где я работаю, мне кажется туманным. Надеюсь, после возвращения этой возможности, мне не придётся снова отовсюду её блокировать из-за внеочередных проблем. Но а на данный момент продолжаем эксперименты.