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

Сторінка оновлюється :
Дата створення сторінки :

Середовище перевірки

Вікна
  • вікна 11
Редактор єдності
  • 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 тощо
bButton circleButton buttonEast
aButton crossButton кнопкаПівдень
xButton squareButton buttonWest
yButton triangleButton кнопкаПівніч

Про те, що можна судити по кнопці, можна сказати наступне.

  • Кнопка, кнопка ×, кнопка вниз
  • кнопка 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. Залежно від ігрової консолі, він буде літати з клавішами зі стрілками та D-pad, але обидва розглядаються як однакові. 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 прикріпіть його і встановіть текстовий об'єкт для відображення.

Спробуйте запустити гру, щоб перевірити, чи з'явиться інформація.