Obsługa za pomocą joysticka (wersja z systemem wejściowym)

Strona zaktualizowana :
Data utworzenia strony :

Środowisko weryfikacyjne

Windows
  • Okna 11
Edytor aparatu Unity
  • 2020.3.25f1
Pakiety systemu wejściowego
  • 1.2.0

Wymagania wstępne dotyczące tej porady

Poniższe ustawienia są wstępnie skonfigurowane jako warunek wstępny wyjaśnienia tych wskazówek.

Informacje o XInput i DirectInput

Chociaż jest ograniczony do systemu Windows, istnieją dwa formaty połączeń dla kontrolerów gier: "DirectInput" i "XInput". "Joystick" odpowiada tutaj "DirectInput".

W Joystick tym programie mamy do czynienia z klasą, ale może ona obsługiwać tylko kontrolery, które obsługują "DirectInput". Aby użyć kontrolera obsługującego "XInput", musisz użyć innej Gamepad klasy.

"DirectInput" to stary format połączenia, a definicja przycisków jest stosunkowo niejednoznaczna i może obsługiwać kontrolery o specjalnych kształtach. Jednak ostatnio "XInput" stał się głównym nurtem, a liczba kontrolerów, które nie obsługują "DirectInput", rośnie. Ponieważ "DirectInput" definiuje przyciski jako "1", "2" i "3", twórcy gier muszą stworzyć system, który pozwoli na odpowiednie ustawienie korespondencji przycisków gry i kontrolera.

"XInput" jest zdefiniowany jako następna generacja "DirectInput" i ma predefiniowane przyciski, wyzwalacze, drążki A i B itp. Dlatego można używać tylko kształtu kontrolera, który jest prawie stały. Ponieważ definicja przycisków jest dobrze zdefiniowana, twórcy gier mogą tworzyć gry pasujące do kontrolera, nie martwiąc się o rozmieszczenie przycisków. Coraz więcej najnowszych kontrolerów gier jest kompatybilnych tylko z "XInput".

Informacje o joystickach

Jak wspomniano powyżej, nie ma definicji przycisku, więc aby faktycznie z niego korzystać, konieczne jest dodanie kłopotliwych procesów, takich jak przypisywanie operacji gry podczas sprawdzania informacji o każdym przycisku. Nie sądzę, że musisz używać DirectInput w nowej grze, ponieważ jest stara, ale pamiętaj, że jeśli naprawdę chcesz ją obsługiwać, twój program może być skomplikowany.

Ta próbka ogranicza się w zasadzie do uzyskania informacji o wymienionych przyciskach. name W rzeczywistości musisz sprawdzić i przypisać operacje.

Pozyskiwanie informacji za pomocą joysticka

Umieść obiekt tekstowy, aby wyświetlić informacje o każdym przycisku na joysticku.

Utwórz skrypt. Nazwa jest umowna, ale w tym przypadku JoystickInfo jest to .

Skrypt wygląda tak: Uzyskiwane informacje różnią się w zależności od typu kontrolera. Bardzo trudno jest zaprogramować dla każdego kontrolera, więc po prostu wyliczam wszystkie przyciski i otrzymuję informacje o typie przycisku i naciśnięciu.

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();
  }
}

Informacje Joystick.current o podłączonym joysticku można uzyskać w . Joystick Następnie otrzymamy każdą informację z klasy.

Joystick Jak widać z klasy, istnieją definicje, takie jak i , ale nie ma definicji, stick trigger takich jak przycisk A lub przycisk Start. Dlatego należy użyć Właściwości, aby wyliczyć wszystkie przyciski, drążkiallControls i znaleźć typ przycisku oraz informacje o naciśnięciu.

Po zapisaniu EventSystem skryptu dołącz go do obiektu tekstowego i ustaw go do wyświetlania informacji.

Spróbuj uruchomić grę za pomocą kontrolera obsługującego DirectInput. Każdą informację można odzyskać.

W zależności od kontrolera możesz nie uzyskać wartości zgodnej z przeznaczeniem po naciśnięciu drążka, strzałki itp. Ponieważ przyciski nie są zdefiniowane w ten sposób, trudno jest uzyskać dokładne informacje o naciśnięciu dla każdego przycisku. Ponadto widać, że dość trudno jest w pełni podeprzeć joystick, np. rozmieszczenie przycisków różni się w zależności od kontrolera.

Jeśli gra ma obsługiwać joysticki, pożądane byłoby posiadanie ekranu ustawień, takiego jak konfiguracja, aby każdy użytkownik mógł dostosować układ przycisków posiadanego kontrolera.

Jak uzyskać informacje dla wielu joysticków

Informacje o Joystick.all wszystkich podłączonych joystickach można uzyskać w . ReadOnlyArray Można go foreach wyliczyć w i tak dalej.

Ponieważ każda wartość jest Joystick klasą, możesz uzyskać informacje o joysticku, tak jak w poprzednim programie.