Работа с джойстик (пакетирана версия на входната система)

Страницата се актуализира :
Дата на създаване на страница :

Среда за проверка

Уиндоус
  • Прозорци 11
Редактор на единство
  • 2020.3.25ф1
Пакети на входната система
  • 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 клас, можете да получите информация за джойстика, както в предишната програма.