Control amb un Gamepad (Versió del paquet del sistema d'entrada)

Pàgina actualitzada :
Data de creació de la pàgina :

Entorn de verificació

Windows
  • Finestres 11
Editor d'unitat
  • 25.3.2020
Paquet del sistema d'entrada
  • 1.2.0

Requisits previs per a aquest consell

La configuració següent s'ha fet amb antelació com a premissa per a la descripció d'aquest consell.

Quant a XInput i DirectInput

Tot i que està limitat a Windows, hi ha dos formats de connexió per als controladors de joc: DirectInput i XInput. Aquí, "Gamepad" correspon a "XInput".

Aquest Gamepad programa s'ocupa de les classes, però això només pot gestionar controladors que suportin "XInput". Per utilitzar un controlador compatible amb DirectInput, heu d'utilitzar una classe diferent Joystick .

"DirectInput" és un format de connexió antic i la definició del botó és relativament ambigua, i pot manejar controladors amb formes especials. No obstant això, recentment, "XInput" s'ha convertit en corrent principal, i el nombre de controladors que no suporten "DirectInput" està augmentant. "DirectInput" té definicions de botons com "1", "2" i "3", de manera que els creadors de jocs han de crear una correspondència de botons entre el joc i el controlador perquè es puguin configurar adequadament.

XInput es defineix com la propera generació de DirectInput i inclou botons A i B predefinits, disparadors, pals, etc. Per tant, només es pot utilitzar una forma fixa del controlador, Com que la definició de botons està ben definida, els creadors de jocs poden crear jocs que s'adaptin al controlador sense preocupar-se de la col·locació dels botons. Els controladors de joc recents que només admeten "XInput" estan augmentant.

Determinar si s'està prement un botó

Podeu determinar si es prem o no un botó per propietats, així com xxxxxxxx.isPressed el teclat i el ratolí. Aquí, m'agradaria mostrar el tipus de botó que estic prement en el text.

Primer, col·loqueu un objecte de text de visualització.

Creeu un guió per al veredicte. El nom del fitxer és arbitrari, però aquí GamepadButtons és .

El guió té aquest aspecte:

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

Després EventSystem de desar l'script, adjunteu-lo i configureu l'objecte de text de visualització.

Proveu d'executar el joc i comproveu si cada botó respon.

Per cert, els botons següents es defineixen com el mateix botó, tot i que es preparen diversos botons perquè es llegeixen de manera diferent segons la consola de jocs. En cadascun dels programes anteriors, s'inclou un procés de judici, de manera que en prémer el botó, es mostren tres botons.

XboxPlayStation i molt més
bBotó cercleBotó botóEstEst
aBotó crossButton botóSud
xButton quadratBotó botóOest
yButton triangleButton botóNord

El que es pot jutjar com un botó és el següent.

  • Un botó, × botó, botó avall
  • Botó B, botó ○, botó dret
  • X botó, botó □, botó esquerre
  • Botó Y, botó de fletxa avall, botó amunt
  • Botó d'inici, botó de menú
  • Seleccioneu el botó, el botó de visualització
  • Botó esquerre de l'espatlla, botó L1
  • Botó de l'espatlla dreta, botó R1
  • Botó de pal esquerre
  • Botó de pal dret

Determinar si es prem el botó

El judici en el moment de prémer es pot determinar per les propietats com passa amb xxxxxxxx.wasPressedThisFrame el teclat i el ratolí. Retorna el valor del moment true en què es prem, i torna encara que false es pressioni i es mantingui a partir de llavors.

Mostrem el botó premut com a text com a comprovació d'operacions. Col·loqueu un objecte de text per mostrar-lo.

El nom del fitxer de l'script pot ser qualsevol cosa, però aquí GamepadButtonsOneFrame està .

El guió té aquest aspecte: Per simplicitat, només es jutgen 4 botons.

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

Després EventSystem de desar l'script, adjunteu-lo i configureu un objecte de text per mostrar-lo.

Proveu d'executar el joc i prémer el botó. Crec que s'afegirà el botó que has pitjat. També pots veure que mantenint premut el botó no s'afegeix text.

Determineu si en el moment en què es deixa anar el botó

No hi ha cap mostra, però podeu determinar si és el moment en què l'allibereu utilitzant una propietat en lloc d'una wasPressedThisFrame wasReleasedThisFrame propietat.

Determinar quan premeu les tecles de fletxa

Determina la premsa del DPAD. Depenent de la videoconsola, volarà amb les tecles de fletxa i el D-pad, però ambdues es tracten igual. El DPAD bàsicament només determina si esteu empenyent en aquesta direcció o no. No hi ha cap judici com "empènyer una mica" com un pal.

Col·loca un objecte de text per mostrar una decisió si es pressiona o no com a comprovació d'operació.

Creeu un script. El nom del fitxer és arbitrari, però aquí GamepadDpad és .

El guió té aquest aspecte:

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

Podeu obtenir informació Gamepad.dpad del DPAD a .

DPAD té leftupdown rightpropietats per a cada direcció, i podeu determinar si és pressionat o no per la propietat, etc. isPressed

DpadControl.ReadValue També podeu utilitzar el mètode per obtenir l'estat Vector2 de la premsa en . Si no es pressiona res (0, 0), si es pressiona l'esquerra (-1, 0), i així successivament.

Després EventSystem de desar l'script, adjunteu-lo i configureu un objecte de text per mostrar-lo.

Proveu d'executar el joc i interactuar amb el DPAD.

Vector2 Per cert, es troba en un estat normalitzat, de manera que quan es prem diagonalment, s'obté com un nombre com (0,7071, 0,7071) en lloc de (1, 1).

Determinar les premses disparadores

Els controladors Xbox tenen botons anomenats disparadors a l'esquerra i a la dreta. A PlayStation, correspon a L2R2. Aquest botó és diferent d'un botó normal i podeu obtenir la quantitat que premeu a 0.0 ~ 1.0. Alguns altres controladors estan equipats amb noms diferents dels disparadors, però en controladors més antics, etc., simplement es poden col·locar com a botons, en aquest cas el judici de prémer només es maneja com a 0, 1.

Aquí, m'agradaria comprovar la quantitat de premses de gallet. Col·loca un objecte de text per mostrar-lo al llenç.

Creeu un script. Com que s'utilitzarà en altres llocs, l'anomenarem aquí GamepadReadValue .

El guió té aquest aspecte:

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 Cada leftTriggerclasse té una propietat i rightTrigger ReadValue podeu obtenir la quantitat de premses en el rang de 0.0 ~ 1.0 trucant al mètode. Els disparadors també es poden tractar com a botons, de manera que isPressed també podeu jutjar com. isPressed true Per cert, la quantitat de esdevé ReadValue es basa en 0,5.

Després de desar l'script, EventSystem adjunteu-lo i configureu un objecte de text per mostrar-lo.

Proveu d'executar el joc i moure el disparador.

Determinar la informació del pal

El pal pot obtenir la informació del pal esquerre i el pal dret respectivament, i es pot obtenir la quantitat de quant s'empeny el pal cap avall en quina direcció. Per descomptat, si no teniu un pal al controlador, no podreu obtenir aquesta informació.

La informació del pal es pot recuperar amb , Gamepad.rightStick respectivamentGamepad.leftStick.

Per a l'script de confirmació de l'operació, desviarem l'script utilitzat anteriorment per obtenir el disparador.

// 省略

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 Podeu obtenir la informació de premsa trucant al Vector2 mètode de ReadValue o . Vector2 Per tant, podeu obtenir quant x y esteu pressionant sobre l'eix X i l'eix Y per i propietats, Si desitja obtenir la direcció que està prement, pot aconseguir-la en la propietat, i si desitja magnitude obtenir la quantitat que està pressionant, normalized pot aconseguir-la en la propietat.

Intenteu moure realment el joc i accionar l'estic.

Obtenir informació sobre el gamepad

Podeu obtenir l'identificador, el nom, etc. del gamepad connectat. Per exemple, consulteu per identificar name el tipus de controlador que està connectat, o Podeu consultar amb quin deviceId gamepad associar-vos quan es connecten diversos gamepads.

Aquí mostrarem la informació en el text per comprovar l'operació.

El nom de l'script és arbitrari, però aquí GamepadInfo és .

El guió té aquest aspecte:

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 Podeu obtenir informació diversa de la recuperada. Aquí en teniu alguns fragments.

Després de desar l'script, EventSystem adjunteu-lo i configureu un objecte de text per mostrar-lo.

Proveu d'executar el joc per veure si apareix la informació.