Funcionamiento con joystick (versión empaquetada del sistema de entrada)

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

Entorno de verificación

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

Requisitos previos para esta sugerencia

Los siguientes ajustes están preconfigurados como requisito previo para la explicación de estos consejos.

Acerca de XInput y DirectInput

Aunque está limitado a Windows, hay dos formatos de conexión para los controladores de juegos: "DirectInput" y "XInput". "Joystick" aquí corresponde a "DirectInput".

En Joystick este programa, estamos tratando con una clase, pero solo puede manejar controladores que admiten "DirectInput". Para usar un controlador que admita "XInput", debe usar una clase diferente Gamepad .

"DirectInput" es un formato de conexión antiguo, y la definición de botones 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. Dado que "DirectInput" define los botones como "1", "2" y "3", los creadores de juegos deben crear un sistema que permita que la correspondencia entre los botones del juego y el mando se establezca correctamente.

"XInput" se define como la próxima generación de "DirectInput" y tiene botones A y B predefinidos, disparadores, palancas, etc. Por lo tanto, solo se puede usar la forma del controlador, que es casi fija. Dado que la definición de botones está bien definida, los creadores de juegos pueden crear juegos que coincidan con el controlador sin preocuparse por la ubicación de los botones. Un número cada vez mayor de controladores de juegos recientes solo son compatibles con "XInput".

Acerca de los joysticks

Como se mencionó anteriormente, no existe una definición del botón, por lo que para usarlo realmente, es necesario agregar procesos problemáticos, como asignar operaciones de juego mientras se examina la información de cada botón. No creo que necesites usar DirectInput en un juego nuevo porque es antiguo, pero ten en cuenta que si realmente quieres admitirlo, tu programa puede ser complicado.

Este ejemplo se limita básicamente a obtener información sobre los botones enumerados. name De hecho, debe verificar y asignar operaciones.

Adquisición de información de joystick

Coloque un objeto de texto para mostrar información sobre cada botón del joystick.

Cree un script. El nombre es arbitrario, pero en este caso JoystickInfo , es .

El script tiene el siguiente aspecto: La información obtenida varía en función del tipo de controlador. Es muy difícil programar para cada controlador, así que solo enumero todos los botones y obtengo el tipo de botón y la información de presión.

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

Puede obtener información Joystick.current sobre el joystick conectado en . Joystick Después de eso, obtendremos cada información de la clase.

Joystick Como puede ver en la clase, hay definiciones como y , stick trigger pero no hay definiciones como el botón A o el botón de inicio. Por lo tanto, debe usar las Propiedades para enumerar todos los botones,allControls palancas y averiguar el tipo de botón y la información de prensado.

Una vez guardado el script, EventSystem adjúntelo y establezca un objeto de texto para mostrar información.

Intenta ejecutar el juego con un mando que admita DirectInput. Cada pieza de información puede ser recuperada.

Dependiendo del controlador, es posible que no obtenga el valor deseado cuando presione una palanca, una tecla de flecha, etc. Dado que los botones no están definidos de esta manera, es difícil obtener información precisa sobre la pulsación de cada botón. Además, se puede ver que es bastante difícil soportar completamente el joystick, ya que la disposición de los botones difiere según el controlador.

Si el juego va a ser compatible con joysticks, sería deseable tener una pantalla de configuración como una configuración de teclas para que cada usuario pueda personalizar el diseño de los botones del controlador que tiene.

Cómo obtener información para varios joysticks

La información sobre Joystick.all todos los joysticks conectados se puede obtener en . ReadOnlyArray Se foreach puede enumerar en y así sucesivamente.

Dado que cada valor es Joystick una clase, puede obtener información del joystick como en el programa anterior.