Изменение изображения зависит от ввода, такого как клавиатура или геймпад Xbox в Unity с новой системой ввода.

Очень приятно иметь трюк в игре, и иногда он помогает игроку больше проникнуться игрой. Мне очень нравится что-то подобное.

Один из них — изменить изображение кнопки, когда игрок использует другой ввод. Например.,

  • При использовании Keyboard изображение будет Keycap (E).
  • Но при использовании Xbox Controller изображением будет Кнопка (X).

Вот пример:

Требование

Для начала я использую эту спецификацию для этой статьи:

  • Единство 2020.3.20f1
  • Пакет Unity Новая система ввода 1.44
  • *Пакет OdinSerializer (для редактирования)

Может также работать более новая версия Unity или система ввода.
*OdinSerializer не является обязательным. Мы будем использовать его в этой статье, так как он будет использоваться для редактирования Словаря из Редактора. Вы также можете использовать другую альтернативную карту, такую ​​как список или массив.

Концепция решения

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

Я использую более общий вариант: мы изменим GameObject со Sprite в немвместо Sprite напрямую, потому что это более удобно для последующего использования.

Идея заключается в том, что мы зарегистрируем слушателя в новой системе ввода, получим обратный вызов и узнаем, какой контроллер используется. Затем мы отправляем/вызываем наш обработчик, чтобы соответствующим образом изменить спрайт.

https://www.canva.com/design/DAFYyLTaYmI/QwPI2tZgGkUa6Fk4xBjk6A/view?utm_content=DAFYyLTaYmI&utm_campaign=designshare&utm_medium=link&utm_source=homepage_design_menu

Использование системы ввода

Прежде всего, нам нужно убедиться, что проект использует новую систему ввода Unity. Если нет, нам нужно установить систему ввода из Диспетчера пакетов и включить ее в Настройках проигрывателя. Вы можете следовать руководству в Документации Unity.

Убедитесь, что компонент PlayerInput в EventSystem подключен, или вы можете добавить его вручную. Мы будем использовать этот компонент для регистрации слушателя.

Подготовьте прослушиватель, ввод при изменении управления (когда поступает новый ввод, он обрабатывает и классифицирует используемый контроллер)

Поэтому нам нужно создать скрипт, который регистрирует слушателя в PlayerInput и обработчик при обнаружении нового ввода.

Как вы можете видеть, ActiveInputType SetActiveInputType() — это функция для обработки того, какой элемент управления используется, и преобразования или классификации в ваш собственный зарегистрированный элемент управления.

После классификации onControlsChanged.Invoke(currentInputType); отправит результат всем нашим Switcher, зарегистрированным в нашем GameObject.

Это будет выглядеть так, как в инспекторе, мы можем отладить, какой текущий тип ввода используется.

Подготовить прослушиватель событий (для обработки спрайта)

Теперь нам нужно создать еще один скрипт для коммутатора. Здесь я буду использовать Dictionary mapSwitchers заливки с картой Input и GameObject. Итак, когда клавиатура активна, она включит назначенную клавиатуру GameObject.

OnEnable и OnDisable будут регистрировать нашего слушателя в наших действиях `ControlChanges`. Таким образом, при изменении нового ввода он активирует функцию swutchOnControlChanged. И в этой функции мы отключаем или активируем наш отображаемый игровой объект соответственно.

Здесь пример в инспекторе выглядит так

Готово. Теперь вам просто нужно применить свой игровой объект соответственно тому, что будет отображаться при использовании клавиатуры или контроллера Xbox.

Подробнее Далее!!!

С помощью этой настройки вы можете добавить дополнительные параметры для другого геймпада или контроллера, например Touch, Nintendo Switch, PS или другого.

В этой функции SetActiveInputType() вы можете добавить больше if-else (или изменить регистр для меньшей сложности) и проверить ввод. Многие контроллеры поддерживаются Unity, например Dualshock PS4, Nintendo Switch или Touch.

Бонус

Вот пример, реализованный в моей игре

продолжай и твори!