Operação com joystick (versão empacotada do Input System)

Página atualizada :
Data de criação de página :

Ambiente de verificação

Windows
  • Janelas 11
Unity Editor
  • 25.3.2020F1
Pacotes do sistema de entrada
  • 1.2.0

Pré-requisitos para esta dica

As configurações a seguir são pré-configuradas como um pré-requisito para a explicação dessas dicas.

Sobre XInput e DirectInput

Embora seja limitado ao Windows, existem dois formatos de conexão para controladores de jogos: "DirectInput" e "XInput". "Joystick" aqui corresponde a "DirectInput".

Neste Joystick programa, estamos lidando com uma classe, mas ela só pode lidar com controladores que suportam "DirectInput". Para usar um controlador que suporta "XInput", você precisa usar uma classe diferente Gamepad .

"DirectInput" é um formato de conexão antigo, e a definição de botões é relativamente ambígua, e pode lidar com controladores com formas especiais. No entanto, recentemente, "XInput" tornou-se mainstream, e o número de controladores que não suportam "DirectInput" está aumentando. Como "DirectInput" define botões como "1", "2" e "3", os criadores de jogos devem criar um sistema que permita que a correspondência do jogo e do botão do controlador seja definida adequadamente.

"XInput" é definido como a próxima geração de "DirectInput" e tem botões A e B predefinidos, gatilhos, sticks, etc. Portanto, a forma do controlador só pode ser usada, que é quase fixa. Como a definição de botões é bem definida, os criadores de jogos podem criar jogos que correspondam ao controle sem se preocupar com o posicionamento dos botões. Um número crescente de controladores de jogos recentes são compatíveis apenas com "XInput".

Sobre os joysticks

Como mencionado acima, não há definição do botão, portanto, para realmente usá-lo, é necessário adicionar processos problemáticos, como atribuir operações de jogo enquanto examina as informações de cada botão. Eu não acho que você precisa usar DirectInput em um novo jogo porque é antigo, mas tenha em mente que se você realmente quiser suportá-lo, seu programa pode ser complicado.

Esta amostra limita-se basicamente a obter informações sobre os botões listados. name Na verdade, você precisa verificar e atribuir operações.

Aquisição de informações por joystick

Coloque um objeto de texto para exibir informações sobre cada botão no joystick.

Crie um script. O nome é arbitrário, mas neste caso JoystickInfo , é.

O script tem a seguinte aparência: As informações obtidas variam de acordo com o tipo de controlador. É muito difícil programar para cada controlador, então eu apenas enumero todos os botões e obtenho o tipo de botão e pressiono informações.

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

Você pode obter informações Joystick.current sobre o joystick conectado no . Joystick Depois disso, obteremos cada informação da turma.

Joystick Como você pode ver na classe, há definições como e , stick trigger mas não há definições como o botão A ou o botão Iniciar. Portanto, você deve usar as Propriedades para enumerar todos os botões, varasallControls e descobrir o tipo de botão e pressionar informações.

Depois que o script for salvo, EventSystem anexe-o e defina um objeto de texto para exibir informações.

Tente executar o jogo com um controlador que suporte DirectInput. Cada informação pode ser recuperada.

Dependendo do controle, você pode não obter o valor como pretendido quando você pressiona um stick, tecla de seta, etc. Como os botões não são definidos dessa forma, é difícil obter informações precisas de pressão para cada botão. Além disso, é possível ver que é bastante difícil suportar totalmente o joystick, como a disposição dos botões difere dependendo do controle.

Se o jogo é para suportar joysticks, seria desejável ter uma tela de configuração como uma configuração de chave para que cada usuário possa personalizar o layout de botão do controle que eles têm.

Como obter informações para vários joysticks

Informações sobre Joystick.all todos os joysticks conectados podem ser obtidas em . ReadOnlyArray Ele foreach pode ser enumerado em e assim por diante.

Como cada valor é Joystick uma classe, você pode obter informações de joystick como no programa anterior.