Controllo con un gamepad (versione del pacchetto del sistema di input)

Pagina aggiornata :
Data di creazione della pagina :

Ambiente di verifica

Finestre
  • Windows 11
Unity Editor
  • 2020.3.25F1
Pacchetto del sistema di input
  • 1.2.0

Prerequisiti per questo suggerimento

Le seguenti impostazioni sono state effettuate in anticipo come premessa per la descrizione di questo suggerimento.

Informazioni su XInput e DirectInput

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

Questo Gamepad programma si occupa di classi, ma può gestire solo controller che supportano "XInput". Per utilizzare un controller che supporta DirectInput, è necessario utilizzare una classe diversa Joystick .

"DirectInput" è un vecchio formato di connessione e la definizione del pulsante è 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. "DirectInput" ha definizioni di pulsanti come "1", "2" e "3", quindi i creatori di giochi devono creare una corrispondenza di pulsanti tra il gioco e il controller in modo che possano essere impostati in modo appropriato.

XInput è definito come la prossima generazione di DirectInput e include pulsanti A e B predefiniti, trigger, stick, ecc. Pertanto, è possibile utilizzare solo una forma fissa del controller, Poiché la definizione dei pulsanti è ben definita, i creatori di giochi possono creare giochi adatti al controller senza preoccuparsi del posizionamento dei pulsanti. I controller di gioco recenti che supportano solo "XInput" sono in aumento.

Determinare se viene premuto un pulsante

È possibile determinare se un pulsante viene premuto o meno dalle proprietà, nonché xxxxxxxx.isPressed dalla tastiera e dal mouse. Qui, vorrei visualizzare il tipo di pulsante che sto premendo nel testo.

Innanzitutto, posizionate un oggetto di testo di visualizzazione.

Creare uno script per il verdetto. Il nome del file è arbitrario, ma eccolo qui GamepadButtons .

Lo script è simile al seguente:

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

Dopo EventSystem aver salvato lo script, collegarlo e configurare l'oggetto di testo visualizzato.

Prova a eseguire il gioco e verifica se ogni pulsante risponde.

A proposito, i seguenti pulsanti sono definiti come lo stesso pulsante, sebbene vengano preparati più pulsanti perché vengono letti in modo diverso a seconda della console di gioco. In ciascuno dei programmi di cui sopra, è incluso un processo di giudizio, quindi quando si preme il pulsante, vengono visualizzati tre pulsanti.

XboxPlayStation e altro ancora
bButton circleButton buttonEast
aButton crossButton buttonSouth
xButton squareButton buttonWest
yButton triangoloPulsante buttonNorth

Ciò che può essere giudicato come un pulsante è il seguente.

  • Un pulsante, × pulsante, giù
  • Pulsante B, pulsante ○, pulsante destro
  • Pulsante X, pulsante □, pulsante sinistro
  • Pulsante Y, pulsante freccia giù, pulsante su
  • Pulsante Start, pulsante Menu
  • Seleziona pulsante, pulsante Visualizza
  • Pulsante spalla sinistra, pulsante L1
  • Pulsante spalla destra, pulsante R1
  • Pulsante della levetta sinistra
  • Pulsante della levetta destra

Determinare se il pulsante viene premuto

Il giudizio al momento della pressione può essere determinato dalle proprietà come con xxxxxxxx.wasPressedThisFrame la tastiera e il mouse. Restituisce il valore del momento true in cui viene premuto e restituisce anche se false viene premuto e tenuto premuto successivamente.

Visualizziamo il pulsante premuto come testo come controllo delle operazioni. Posizionare un oggetto di testo per la visualizzazione.

Il nome del file dello script può essere qualsiasi cosa, ma eccolo qui GamepadButtonsOneFrame .

Lo script è simile al seguente: Per semplicità, vengono giudicati solo 4 pulsanti.

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";
  }
}

Dopo EventSystem aver salvato lo script, allegarlo e impostare un oggetto di testo per la visualizzazione.

Prova a eseguire il gioco e a premere il pulsante. Penso che il pulsante che hai premuto verrà aggiunto. Puoi anche vedere che tenendo premuto il pulsante non viene aggiunto alcun testo.

Determinare se il momento in cui il pulsante viene rilasciato

Non esiste un esempio, ma è possibile determinare se è wasPressedThisFrame il momento in cui lo si rilascia utilizzando una proprietà anziché wasReleasedThisFrame una proprietà.

Determinare quando si premono i tasti freccia

Determina la pressione del DPAD. A seconda della console di gioco, volerà con i tasti freccia e la croce direzionale, ma entrambi sono trattati allo stesso modo. Il DPAD determina fondamentalmente solo se stai spingendo in quella direzione o meno. Non c'è giudizio come "spingere un po'" come un bastone.

Inserisce un oggetto di testo per visualizzare una decisione se premerlo o meno come controllo dell'operazione.

Creare uno script. Il nome del file è arbitrario, ma eccolo qui GamepadDpad .

Lo script è simile al seguente:

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

È possibile ottenere informazioni Gamepad.dpad su DPAD all'indirizzo .

DPAD ha leftupdown rightproprietà per ogni direzione ed è possibile determinare se viene premuto o meno dalla proprietà e così via. isPressed

DpadControl.ReadValue È inoltre possibile utilizzare il metodo per ottenere lo stato Vector2 della stampa in . Se non viene premuto nulla (0, 0), se viene premuto a sinistra (-1, 0) e così via.

Dopo EventSystem aver salvato lo script, allegarlo e impostare un oggetto di testo per la visualizzazione.

Prova a eseguire il gioco e a interagire con il DPAD.

Vector2 A proposito, è in uno stato normalizzato, quindi quando si preme diagonalmente, si ottiene come un numero come (0,7071, 0,7071) invece di (1, 1).

Determinare le pressioni del grilletto

I controller Xbox hanno pulsanti chiamati trigger a sinistra e a destra. Su PlayStation, corrisponde a L2R2. Questo pulsante è diverso da un pulsante normale e puoi ottenere la quantità che stai premendo in 0.0 ~ 1.0. Alcuni altri controller sono dotati di nomi diversi dai trigger, ma nei controller più vecchi, ecc., Possono essere semplicemente posizionati come pulsanti, nel qual caso il giudizio di pressione viene gestito solo come 0, 1.

Qui, vorrei controllare la quantità di pressioni del grilletto. Inserisce un oggetto di testo per la visualizzazione nell'area di disegno.

Creare uno script. Dal momento che sarà usato altrove, lo chiameremo qui GamepadReadValue .

Lo script è simile al seguente:

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 Ogni leftTriggerclasse ha una proprietà ed rightTrigger ReadValue è possibile ottenere la quantità di presse nell'intervallo 0,0 ~ 1,0 chiamando il metodo. I trigger possono anche essere trattati come pulsanti, quindi isPressed puoi anche giudicare come. isPressed true A proposito, la quantità di diventa ReadValue si basa su 0, 5.

Dopo aver salvato lo script, EventSystem allegarlo e impostare un oggetto di testo per la visualizzazione.

Prova a eseguire il gioco e a spostare il grilletto.

Determinare le informazioni sul bastone

Il bastone può ottenere le informazioni rispettivamente della levetta sinistra e della levetta destra e puoi ottenere la quantità di quanto il bastone viene spinto verso il basso in quale direzione. Naturalmente, se non si dispone di una chiavetta sul controller, non sarà possibile ottenere queste informazioni.

Le informazioni stick possono essere recuperate rispettivamente con , Gamepad.rightStick .Gamepad.leftStick

Per lo script di conferma dell'operazione, devieremo lo script utilizzato in precedenza per ottenere il trigger.

// 省略

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 È possibile ottenere le informazioni stampa chiamando il Vector2 metodo da ReadValue o . Vector2 Quindi puoi ottenere quanto x y stai premendo sull'asse X e sull'asse Y da e proprietà, Se vuoi ottenere la direzione che stai premendo, puoi ottenerlo nella proprietà, e se vuoi magnitude ottenere la quantità che stai premendo, puoi normalized ottenerlo nella proprietà.

Prova a muovere effettivamente il gioco e azionare il bastone.

Ottieni informazioni sul gamepad

È possibile ottenere l'ID, il nome, ecc. dal gamepad collegato. Ad esempio, fare riferimento a per identificare name il tipo di controller connesso, oppure È possibile fare riferimento a quale deviceId gamepad associare quando sono collegati più gamepad.

Qui, mostreremo le informazioni nel testo per verificare l'operazione.

Il nome dello script è arbitrario, ma eccolo qui GamepadInfo .

Lo script è simile al seguente:

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 È possibile ottenere varie informazioni dal file . Ecco alcuni estratti.

Dopo aver salvato lo script, EventSystem allegarlo e impostare un oggetto di testo per la visualizzazione.

Prova a eseguire il gioco per vedere se vengono visualizzate le informazioni.