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

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

Среда верификации

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

Предпосылки для этого совета

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

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

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

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

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

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

Определите, нажимается ли кнопка

Вы можете определить, нажимается кнопка или нет, по свойствам, а также по клавиатуре xxxxxxxx.isPressed и мыши. Здесь я хотел бы отобразить тип кнопки, которую я нажимаю в тексте.

Сначала поместите экранный текстовый объект.

Создайте сценарий для вердикта. Имя файла произвольное, но здесь GamepadButtons он .

Скрипт выглядит следующим образом:

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

public class GamepadButtons : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ボタンを押している間は xxxxxxxx.isPressed が true を返します

    // B ボタンや East ボタン、○ボタンは読み方が違うだけで同じボタンです
    // これは PlayStation や Xbox, Switch などでボタンの読み方が違うためです
    if (gamepad.aButton.isPressed) Builder.AppendLine($"A");
    if (gamepad.bButton.isPressed) Builder.AppendLine($"B");
    if (gamepad.xButton.isPressed) Builder.AppendLine($"X");
    if (gamepad.yButton.isPressed) Builder.AppendLine($"Y");

    if (gamepad.buttonEast.isPressed) Builder.AppendLine($"East");
    if (gamepad.buttonWest.isPressed) Builder.AppendLine($"West");
    if (gamepad.buttonNorth.isPressed) Builder.AppendLine($"North");
    if (gamepad.buttonSouth.isPressed) Builder.AppendLine($"South");

    if (gamepad.circleButton.isPressed) Builder.AppendLine($"Circle");
    if (gamepad.crossButton.isPressed) Builder.AppendLine($"Cross");
    if (gamepad.triangleButton.isPressed) Builder.AppendLine($"Triangle");
    if (gamepad.squareButton.isPressed) Builder.AppendLine($"Square");

    // コントローラーの中央にあるスタートボタン、セレクトボタン、メニューボタン、ビューボタンなどに該当します。
    if (gamepad.startButton.isPressed) Builder.AppendLine($"Start");
    if (gamepad.selectButton.isPressed) Builder.AppendLine($"Select");

    // 左と右のスティックをまっすぐ押し込んだかどうかを判定します
    if (gamepad.leftStickButton.isPressed) Builder.AppendLine($"LeftStickButton");
    if (gamepad.rightStickButton.isPressed) Builder.AppendLine($"RightStickButton");

    // 左上と右上にあるボタン。PlayStation だと L1 や R1 に該当します
    if (gamepad.leftShoulder.isPressed) Builder.AppendLine($"LeftShoulder");
    if (gamepad.rightShoulder.isPressed) Builder.AppendLine($"RightShoulder");

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

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

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

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

Xbox,PlayStation и многое другое
bКнопка circleButton buttonEast
Кнопка crossButton кнопкаЮг
xКнопка squareButton buttonWest
yКнопка треугольникКнопка кнопкаСевер

То, что можно судить о кнопке, заключается в следующем.

  • Кнопка, × кнопка, кнопка вниз
  • Кнопка B, кнопка ○, правая кнопка
  • Кнопка X, кнопка □, левая кнопка
  • Кнопка Y, кнопка со стрелкой вниз, кнопка вверх
  • Кнопка «Пуск», кнопка «Меню»
  • Кнопка «Выбрать», кнопка «Просмотр»
  • Левая плечевая кнопка, кнопка L1
  • Правая плечевая кнопка, кнопка R1
  • Левая кнопка джойстика
  • Кнопка правого джойстика

Определите, нажата ли кнопка

Суждение в момент нажатия можно определить по свойствам, как у xxxxxxxx.wasPressedThisFrame клавиатуры и мыши. Возвращает значение момента true нажатия и возвращается, даже если false оно было нажато и удерживалось впоследствии.

Давайте отобразим нажатую кнопку в виде текста в качестве проверки операции. Поместите текстовый объект для отображения.

Имя файла скрипта может быть любым, но вот GamepadButtonsOneFrame оно .

Скрипт выглядит следующим образом: Для простоты оцениваются только 4 кнопки.

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

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

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

    // 1つ目のゲームパッドの情報を取得
    var gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    // ボタンが押された瞬間かどうかを判定
    if (gamepad.aButton.wasPressedThisFrame) TextObject.text += "A";
    if (gamepad.bButton.wasPressedThisFrame) TextObject.text += "B";
    if (gamepad.xButton.wasPressedThisFrame) TextObject.text += "X";
    if (gamepad.yButton.wasPressedThisFrame) TextObject.text += "Y";
  }
}

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

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

Определите, был ли момент отпускания кнопки

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

Определение нажатия клавиш со стрелками

Определяет нажатие DPAD. В зависимости от игровой консоли, он будет летать с клавишами со стрелками и крестовиной, но оба рассматриваются как одно и то же. DPAD в основном только определяет, продвигаетесь ли вы в этом направлении или нет. Нет такого суждения, как «немного толкнуть», как палкой.

Помещает текстовый объект для отображения решения о том, нажат он или нет, в качестве проверки операции.

Создайте сценарий. Имя файла произвольное, но здесь GamepadDpad он .

Скрипт выглядит следующим образом:

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

public class GamepadDpad : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // Dpad の押下情報を Vector2 として取得するパターン
    var value = gamepad.dpad.ReadValue();
    Builder.Append($"(x:{value.x}, y:{value.y})");

    // Dpad の各方向のボタンを押しているかどうかの判定
    if (gamepad.dpad.left.isPressed) Builder.Append(" left");
    if (gamepad.dpad.right.isPressed) Builder.Append(" right");
    if (gamepad.dpad.up.isPressed) Builder.Append(" up");
    if (gamepad.dpad.down.isPressed) Builder.Append(" down");

    // Dpad の情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Вы можете получить информацию о Gamepad.dpad DPAD по адресу .

DPAD имеет leftupdown rightсвойства для каждого направления, и вы можете определить, нажимается ли он или нет, по свойству и т. д. isPressed

DpadControl.ReadValue Вы также можете использовать этот метод, чтобы получить состояние Vector2 пресса в . Если ничего не нажато (0, 0), если слева нажато (-1, 0) и так далее.

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

Попробуйте запустить игру и взаимодействовать с DPAD.

Vector2 Кстати, находится в нормализованном состоянии, поэтому при нажатии по диагонали получается такое число, как (0,7071, 0,7071) вместо (1, 1).

Определение нажатий на спусковой крючок

Контроллеры Xbox имеют кнопки, называемые триггерами, слева и справа. На PlayStation он соответствует L2R2. Эта кнопка отличается от обычной кнопки, и вы можете получить сумму, которую вы нажимаете, в 0.0 ~ 1.0. Некоторые другие контроллеры оснащены именами, отличными от триггеров, но в старых контроллерах и т. Д. Они могут быть просто размещены в виде кнопок, и в этом случае суждение о нажатии обрабатывается только как 0, 1.

Здесь я хотел бы проверить количество нажатий на спусковой крючок. Помещает текстовый объект для отображения на холсте.

Создайте сценарий. Поскольку он будет использоваться в другом месте, мы назовем его здесь GamepadReadValue .

Скрипт выглядит следующим образом:

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

public class GamepadReadValue : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // トリガーの押下量を取得
    Builder.AppendLine($"LeftTrigger:{gamepad.leftTrigger.ReadValue()}");
    Builder.AppendLine($"RightTrigger:{gamepad.rightTrigger.ReadValue()}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Gamepad У каждого leftTriggerкласса есть свойство, и rightTrigger ReadValue вы можете получить количество нажатий в диапазоне 0,0~1,0, вызвав метод. Триггеры также можно рассматривать как кнопки, поэтому isPressed вы также можете судить о таких как. isPressed true Кстати, сумма становится ReadValue из расчета 0,5.

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

Попробуйте запустить игру и переместить спусковой крючок.

Определение информации о палке

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

Информация о палке может быть получена с помощью , Gamepad.rightStick соответственноGamepad.leftStick.

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

// 省略

public class GamepadReadValue : MonoBehaviour
{
  // 省略

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    // 省略

    // トリガーの押下量を取得
    Builder.AppendLine($"LeftTrigger:{gamepad.leftTrigger.ReadValue()}");
    Builder.AppendLine($"RightTrigger:{gamepad.rightTrigger.ReadValue()}");

    // スティックの入力を取得
    var leftStickValue = gamepad.leftStick.ReadValue();
    Builder.AppendLine($"LeftStick:{leftStickValue.normalized * leftStickValue.magnitude}");
    var rightStickValue = gamepad.rightStick.ReadValue();
    Builder.AppendLine($"RightStick:{rightStickValue.normalized * rightStickValue.magnitude}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

leftStickrightStick Сведения о прессе можно получить, вызвав Vector2 метод из ReadValue или . Vector2 Таким образом, вы можете узнать, насколько сильно вы нажимаете на ось X и ось Y, по свойствам,x y Если вы хотите получить направление, в котором вы нажимаете, вы можете получить его в собственности, а если вы хотите получить сумму, которую вы нажимаете, вы magnitude normalized можете получить ее в собственности.

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

Получить информацию о геймпаде

Вы можете получить идентификатор, имя и т. Д. С подключенного геймпада. Например, обратитесь к, чтобы определить name тип подключенного контроллера, или Вы можете указать, с каким геймпадом ассоциироваться, deviceId когда подключено несколько геймпадов.

Здесь мы отобразим информацию в тексте, чтобы проверить операцию.

Название скрипта произвольное, но здесь GamepadInfo оно .

Скрипт выглядит следующим образом:

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

public class GamepadInfo : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ゲームパッドの各情報を取得
    Builder.AppendLine($"deviceId:{gamepad.deviceId}");
    Builder.AppendLine($"name:{gamepad.name}");
    Builder.AppendLine($"displayName:{gamepad.displayName}");
    Builder.AppendLine($"shortDisplayName:{gamepad.shortDisplayName}");
    Builder.AppendLine($"path:{gamepad.path}");
    Builder.AppendLine($"layout:{gamepad.layout}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Gamepad Вы можете получить различную информацию из полученного файла . Вот некоторые выдержки.

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

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