Funzionamento con joystick (versione confezionata con sistema di input)

Pagina aggiornata :
Data di creazione della pagina :

Ambiente di verifica

Finestre
  • finestre 11
Unity Editor
  • 2020.3.25f1
Pacchetti del sistema di input
  • 1.2.0

Prerequisiti per questo suggerimento

Le seguenti impostazioni sono preconfigurate come prerequisito per la spiegazione di questi suggerimenti.

Informazioni su XInput e DirectInput

Sebbene sia limitato a Windows, esistono due formati di connessione per i controller di gioco: "DirectInput" e "XInput". "Joystick" qui corrisponde a "DirectInput".

In Joystick questo programma, abbiamo a che fare con una classe, ma può gestire solo controller che supportano "DirectInput". Per utilizzare un controller che supporta "XInput", è necessario utilizzare una classe diversa Gamepad .

"DirectInput" è un vecchio formato di connessione e la definizione dei pulsanti è relativamente ambigua e può gestire controller con forme speciali. Tuttavia, di recente, "XInput" è diventato mainstream e il numero di controller che non supportano "DirectInput" è in aumento. Poiché "DirectInput" definisce i pulsanti come "1", "2" e "3", i creatori di giochi devono creare un sistema che consenta di impostare in modo appropriato la corrispondenza dei pulsanti del gioco e del controller.

"XInput" è definito come la prossima generazione di "DirectInput" e dispone di pulsanti A e B, trigger, stick e così via predefiniti. Pertanto, è possibile utilizzare solo la forma del controller, che è quasi fissa. Poiché la definizione dei pulsanti è ben definita, i creatori di giochi possono creare giochi che corrispondono al controller senza preoccuparsi del posizionamento dei pulsanti. Un numero crescente di controller di gioco recenti sono compatibili solo con "XInput".

Informazioni sui joystick

Come accennato in precedenza, non esiste una definizione di pulsante, quindi per utilizzarlo effettivamente, è necessario aggiungere processi problematici come l'assegnazione di operazioni di gioco mentre si esaminano le informazioni di ciascun pulsante. Non credo che sia necessario utilizzare DirectInput in un nuovo gioco perché è vecchio, ma tieni presente che se vuoi davvero supportarlo, il tuo programma può essere complicato.

Questo esempio si limita fondamentalmente a ottenere informazioni sui pulsanti elencati. name In effetti, è necessario controllare e assegnare le operazioni.

Acquisizione informazioni joystick

Posizionare un oggetto di testo per visualizzare le informazioni su ciascun pulsante del joystick.

Creare uno script. Il nome è arbitrario, ma in questo caso JoystickInfo lo è .

Lo script è simile al seguente: Le informazioni ottenute variano a seconda del tipo di controller. È molto difficile programmare per ogni controller, quindi mi limito a enumerare tutti i pulsanti e ottenere il tipo di pulsante e le informazioni sulla pressione.

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

È possibile ottenere informazioni Joystick.current sul joystick collegato in . Joystick Dopodiché, otterremo tutte le informazioni dalla classe.

Joystick Come si può vedere dalla classe, ci sono definizioni come e , stick trigger ma non ci sono definizioni come il pulsante A o il pulsante di avvio. Pertanto, è necessario utilizzare le proprietà per enumerare tutti i pulsanti, le levette e scoprire il tipo di pulsante e leallControls informazioni sulla pressione.

Una volta salvato lo script, EventSystem allegalo e imposta un oggetto di testo per la visualizzazione delle informazioni.

Prova a eseguire il gioco con un controller che supporta DirectInput. Ogni informazione può essere recuperata.

A seconda del controller, potresti non ottenere il valore previsto quando premi una levetta, un tasto freccia, ecc. Poiché i pulsanti non sono definiti in questo modo, è difficile ottenere informazioni precise sulla pressione per ciascun pulsante. Inoltre, puoi vedere che è abbastanza difficile supportare completamente il joystick, poiché la disposizione dei pulsanti varia a seconda del controller.

Se il gioco deve supportare i joystick, sarebbe auspicabile avere una schermata di impostazione come una configurazione dei tasti in modo che ogni utente possa personalizzare la disposizione dei pulsanti del controller che possiede.

Come ottenere informazioni per più joystick

Le informazioni su Joystick.all tutti i joystick collegati possono essere ottenute in . ReadOnlyArray Può foreach essere enumerato in e così via.

Poiché ogni valore è una classe, è Joystick possibile ottenere informazioni sul joystick come nel programma precedente.