Control con un Gamepad (versión del paquete del sistema de entrada)

Actualización de la página :
Fecha de creación de la página :

Entorno de verificación

Windows
  • Ventanas 11
Unity Editor
  • 2020.3.25f1
Paquete del sistema de entrada
  • 1.2.0

Requisitos previos para esta sugerencia

Los siguientes ajustes se han realizado de antemano como premisa para la descripción de este consejo.

Acerca de XInput y DirectInput

Aunque está limitado a Windows, hay dos formatos de conexión para los dispositivos de juego: DirectInput y XInput. Aquí, "Gamepad" corresponde a "XInput".

Este Gamepad programa se ocupa de las clases, pero esto sólo puede manejar controladores que soportan "XInput". Para usar un controlador que admita DirectInput, debe usar una clase diferente Joystick .

"DirectInput" es un formato de conexión antiguo y la definición del botón es relativamente ambigua, y puede manejar controladores con formas especiales. Sin embargo, recientemente, "XInput" se ha convertido en la corriente principal, y el número de controladores que no admiten "DirectInput" está aumentando. "DirectInput" tiene definiciones de botones como "1", "2" y "3", por lo que los creadores de juegos deben crear una correspondencia de botones entre el juego y el controlador para que puedan configurarse adecuadamente.

XInput se define como la próxima generación de DirectInput e incluye botones A y B predefinidos, disparadores, sticks, etc. Por lo tanto, solo se puede usar una forma fija del controlador, Dado que la definición de botones está bien definida, los creadores de juegos pueden crear juegos que se adapten al controlador sin preocuparse por la ubicación de los botones. Los controladores de juegos recientes que solo admiten "XInput" están aumentando.

Determinar si se está presionando un botón

Puede determinar si un botón está presionado o no por las propiedades, así como xxxxxxxx.isPressed por el teclado y el mouse. Aquí, me gustaría mostrar el tipo de botón que estoy presionando en el texto.

En primer lugar, coloque un objeto de texto para mostrar.

Cree un guión para el veredicto. El nombre del archivo es arbitrario, pero aquí GamepadButtons está .

El script tiene este aspecto:

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

Después de EventSystem guardar el script, adjúntelo y configúrelo al objeto de texto para mostrar.

Intenta ejecutar el juego y ve si cada botón responde.

Por cierto, los siguientes botones se definen como el mismo botón, aunque se preparan varios botones porque se leen de manera diferente según la consola de juegos. En cada uno de los programas anteriores, se incluye un proceso de juicio, por lo que cuando presiona el botón, se muestran tres botones.

XboxPlayStation y más
bBotón circleButton botónEste
aButton crossButton botónSur
xButton squareButton botónOeste
yButton triangleButton botónNorte

Lo que se puede juzgar como un botón es lo siguiente.

  • Un botón, × botón, botón abajo
  • Botón B, ○ botón, botón derecho
  • Botón X, botón □, botón izquierdo
  • Botón Y, botón de flecha abajo, botón arriba
  • botón Inicio, botón Menú
  • Seleccionar botón, botón Ver
  • Botón izquierdo del hombro, botón L1
  • Botón del hombro derecho, botón R1
  • Botón izquierdo del stick
  • Botón derecho del stick

Determinar si se presiona el botón

El juicio en el momento de la pulsación puede ser determinado por las propiedades como con xxxxxxxx.wasPressedThisFrame el teclado y el ratón. Devuelve el valor del momento true en que se presiona y devuelve incluso si false se presiona y se mantiene presionado a partir de entonces.

Vamos a mostrar el botón presionado como texto como una comprobación de operaciones. Coloque un objeto de texto para mostrarlo.

El nombre de archivo del script puede ser cualquier cosa, pero aquí GamepadButtonsOneFrame está .

El script tiene este aspecto: Para simplificar, solo se juzgan 4 botones.

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

Después de guardar el script, adjúntelo y establezca un objeto de EventSystem texto para su visualización.

Intenta ejecutar el juego y presiona el botón. Creo que se agregará el botón que presionaste. También puede ver que mantener presionado el botón no agrega ningún texto.

Determinar si en el momento en que se suelta el botón

No hay ninguna muestra, pero puede determinar si es wasPressedThisFrame el momento en que la libera utilizando una propiedad en lugar de wasReleasedThisFrame una propiedad.

Determinar cuándo presiona las teclas de flecha

Determina la pulsación del DPAD. Dependiendo de la consola de juegos, volará con las teclas de flecha y el D-pad, pero ambos se tratan como iguales. El DPAD básicamente solo determina si está empujando en esa dirección o no. No hay juicio como "empujar un poco" como un palo.

Coloca un objeto de texto para mostrar una decisión de si se presiona o no como una comprobación de operaciones.

Cree un script. El nombre del archivo es arbitrario, pero aquí GamepadDpad está .

El script tiene este aspecto:

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

Puede obtener información Gamepad.dpad sobre DPAD en .

DPAD tiene leftupdown rightpropiedades para cada dirección, y puede determinar si está presionado o no por la propiedad, etc. isPressed

DpadControl.ReadValue También puede utilizar el método para obtener el estado Vector2 de la prensa en . Si no se presiona nada (0, 0), si se presiona izquierda (-1, 0), y así sucesivamente.

Después de guardar el script, adjúntelo y establezca un objeto de EventSystem texto para su visualización.

Intenta ejecutar el juego e interactuar con el DPAD.

Vector2 Por cierto, está en un estado normalizado, por lo que cuando presionas diagonalmente, se obtiene como un número como (0.7071, 0.7071) en lugar de (1, 1).

Determinar las pulsaciones del gatillo

Los controladores de Xbox tienen botones llamados disparadores a la izquierda y a la derecha. En PlayStation, corresponde a L2R2. Este botón es diferente de un botón normal, y puede obtener la cantidad que está presionando en 0.0 ~ 1.0. Algunos otros controladores están equipados con nombres distintos de los gatillos, pero en los controladores más antiguos, etc., simplemente se pueden colocar como botones, en cuyo caso el juicio de presionar se maneja solo como 0, 1.

Aquí, me gustaría comprobar la cantidad de pulsaciones de gatillo. Coloca un objeto de texto para mostrarlo en el lienzo.

Cree un script. Dado que se usará en otro lugar, lo nombraremos aquí GamepadReadValue .

El script tiene este aspecto:

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 leftTriggerclase tiene una propiedad y rightTrigger ReadValue puede obtener la cantidad de prensas en el rango de 0.0 ~ 1.0 llamando al método. Los disparadores también se pueden tratar como botones, por lo que también puede juzgar, por isPressed ejemplo. isPressed true Por cierto, la cantidad de se convierte se ReadValue basa en 0.5.

Después de guardar el script, EventSystem adjúntelo y establezca un objeto de texto para su visualización.

Intenta ejecutar el juego y mover el gatillo.

Determinar la información del stick

El palo puede obtener la información del palo izquierdo y el palo derecho respectivamente, y puede obtener la cantidad de cuánto se empuja el palo hacia abajo en qué dirección. Por supuesto, si no tiene un stick en su controlador, no podrá obtener esta información.

La información del stick se puede recuperar con , Gamepad.rightStick respectivamenteGamepad.leftStick.

Para el script de confirmación de la operación, desviaremos el script utilizado anteriormente para obtener 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 Puede obtener la información de prensa llamando al Vector2 método desde ReadValue o . Vector2 Para que pueda obtener cuánto x y está presionando en el eje X y el eje Y por y propiedades, Si desea obtener la dirección que está presionando, puede obtenerla en la propiedad, y si magnitude desea obtener la cantidad que está presionando, normalized puede obtenerla en la propiedad.

Intenta mover el juego y operar el palo.

Obtener información del gamepad

Puede obtener el ID, el nombre, etc. del gamepad conectado. Por ejemplo, consulte a para identificar name el tipo de controlador que está conectado, o Puede consultar con qué deviceId gamepad asociarse cuando hay varios gamepads conectados.

Aquí, mostraremos la información en el texto para verificar la operación.

El nombre del script es arbitrario, pero aquí GamepadInfo está .

El script tiene este aspecto:

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 Puede obtener información diversa del archivo . Aquí hay algunos extractos.

Después de guardar el script, EventSystem adjúntelo y establezca un objeto de texto para su visualización.

Intenta ejecutar el juego para ver si aparece la información.