Управление с помощью джойстика (комплектная версия Input System)

Страница обновлена :
Дата создания страницы :

Проверочная среда

Виндоус
  • Windows 11
Редактор Unity
  • 2020.3.25f1
Системные пакеты ввода
  • 1.2.0

Необходимые условия для получения этого совета

Следующие параметры предварительно настроены в качестве предварительного условия для объяснения этих советов.

Сведения о XInput и DirectInput

Несмотря на то, что он ограничен Windows, существует два формата подключения игровых контроллеров: «DirectInput» и «XInput». "Джойстик" здесь соответствует "DirectInput".

В Joystick этой программе мы имеем дело с классом, но он может работать только с контроллерами, поддерживающими "DirectInput". Чтобы использовать контроллер, поддерживающий "XInput", необходимо использовать другой Gamepad класс.

"DirectInput" - это старый формат подключения, и определение кнопок относительно неоднозначно, и он может работать с контроллерами со специальными формами. Однако в последнее время "XInput" стал мейнстримом, и количество контроллеров, не поддерживающих "DirectInput", увеличивается. Поскольку "DirectInput" определяет кнопки как "1", "2" и "3", создатели игр должны создать систему, которая позволяет соответствующим образом установить соответствие кнопок игры и контроллера.

"XInput" определяется как следующее поколение "DirectInput" и имеет предопределенные кнопки A и B, триггеры, джойстики и т.д. Поэтому можно использовать только форму контроллера, которая практически фиксирована. Поскольку определение кнопок четко определено, создатели игр могут создавать игры, соответствующие контроллеру, не беспокоясь о размещении кнопок. Все большее число современных игровых контроллеров совместимы только с "XInput".

О джойстиках

Как уже было сказано выше, определения кнопки нет, поэтому для того, чтобы реально ею пользоваться, необходимо добавить хлопотные процессы, такие как назначение игровых операций при изучении информации каждой кнопки. Я не думаю, что вам нужно использовать DirectInput в новой игре, потому что он старый, но имейте в виду, что если вы действительно хотите его поддерживать, ваша программа может быть сложной.

Этот пример в основном ограничивается получением информации по перечисленным кнопкам. name По сути, нужно проверять и назначать операции.

Сбор информации с помощью джойстика

Разместите текстовый объект для отображения информации о каждой кнопке на джойстике.

Создайте сценарий. Название произвольное, но в данном случае JoystickInfo это .

Скрипт выглядит следующим образом: Получаемая информация зависит от типа контроллера. Очень сложно запрограммировать для каждого контроллера, поэтому я просто перечисляю все кнопки и получаю информацию о типе кнопки и нажатии.

using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.UI;

public class JoystickInfo : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  StringBuilder Builder = new StringBuilder();

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // 1つ目のジョイスティックの情報を取得
    var joystick = Joystick.current;
    if (joystick == null)
    {
      Debug.Log("ジョイスティックがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ジョイスティックの情報取得
    Builder.AppendLine($"deviceId:{joystick.deviceId}");
    Builder.AppendLine($"name:{joystick.name}");
    Builder.AppendLine($"displayName:{joystick.displayName}");

    // ジョイスティックにはボタンの大部分が定義されていないので
    // 基本的には allControls で列挙して入力の種類と値を確認していく
    foreach (var key in joystick.allControls)
    {
      if (key is StickControl stick)
      {
        if (stick.up.isPressed) Builder.AppendLine($"{key.name} Up");
        if (stick.down.isPressed) Builder.AppendLine($"{key.name} Down");
        if (stick.left.isPressed) Builder.AppendLine($"{key.name} Left");
        if (stick.right.isPressed) Builder.AppendLine($"{key.name} Right");

        var value = stick.ReadValue();
        if (value.magnitude > 0f)
        {
          Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
        }
      }
      else if (key is Vector2Control vec2)
      {
        var value = vec2.ReadValue();
        if (value.magnitude > 0f)
        {
          Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
        }
        if (vec2.x.ReadValue() != 0f)
        {
          Builder.AppendLine($"{key.name}.x:{vec2.x.ReadValue()}");
        }
        if (vec2.y.ReadValue() != 0f)
        {
          Builder.AppendLine($"{key.name}.x:{vec2.y.ReadValue()}");
        }
      }
      else if (key is ButtonControl button)
      {
        if (button.isPressed) Builder.AppendLine($"{key.name} isPress");
        var value = button.ReadValue();
        if (value != 0f)
        {
          Builder.AppendLine($"{key.name}:{value}");
        }
      }
      else if (key is AxisControl axis)
      {
        if (axis.IsPressed()) Builder.AppendLine($"{key.name} isPress");

        var value = axis.ReadValue();
        if (value != 0f)
        {
          Builder.AppendLine($"{key.name}:{value}");
        }
      }
      else
      {
        Builder.AppendLine($"Type={key.GetType()}");
      }
    }

    // 押しているボタン一覧をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Получить информацию Joystick.current о подключенном джойстике можно в формате . Joystick После этого мы получим каждую информацию из класса.

Joystick Как видно из класса, есть определения, такие как и , но нет определений, stick trigger таких как кнопка A или кнопка запуска. Поэтому следует использовать Свойства, чтобы перечислить все кнопки, стики,allControls а также узнать тип кнопки и информацию о нажатии.

После того, как скрипт будет сохранен, EventSystem прикрепите его и установите текстовый объект для отображения информации.

Попробуйте запустить игру с помощью контроллера, поддерживающего DirectInput. Каждый фрагмент информации может быть извлечен.

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

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

Как получить информацию для нескольких джойстиков

Информацию обо Joystick.all всех подключенных джойстиках можно получить в формате . ReadOnlyArray Его foreach можно перечислить и так далее.

Так как каждое значение является Joystick классом, вы можете получить информацию о джойстике, как и в предыдущей программе.