Робота за допомогою джойстика (комплектна версія Input System)

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

Середовище верифікації

Вікна
  • Вікна 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 класом, ви можете отримати інформацію про джойстик, як і в попередній програмі.