Controlando com um Gamepad (Versão do Pacote do Sistema de Entrada)

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

Ambiente de verificação

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

Pré-requisitos para esta dica

As configurações a seguir foram feitas com antecedência como premissa para a descrição desta dica.

Sobre XInput e DirectInput

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

Este Gamepad programa lida com classes, mas isso só pode lidar com controladores que suportam "XInput". Para usar um controlador que ofereça suporte a DirectInput, você precisa usar uma classe diferente Joystick .

"DirectInput" é um formato de conexão antigo e a definição do botão é relativamente ambígua, e ele 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. "DirectInput" tem definições de botão como "1", "2" e "3", então os criadores de jogos devem criar uma correspondência de botão entre o jogo e o controle para que eles possam ser definidos adequadamente.

XInput é definido como a próxima geração de DirectInput e inclui botões A e B predefinidos, gatilhos, sticks, etc. Portanto, apenas uma forma fixa do controlador pode ser usada, Como a definição de botões é bem definida, os criadores de jogos podem criar jogos que se adequam ao controle sem se preocupar com o posicionamento dos botões. Controladores de jogos recentes que suportam apenas "XInput" estão aumentando.

Determinar se um botão está sendo pressionado

Você pode determinar se um botão é pressionado ou não por propriedades, bem como xxxxxxxx.isPressed teclado e mouse. Aqui, gostaria de exibir o tipo de botão que estou pressionando no texto.

Primeiro, coloque um objeto de texto de exibição.

Crie um script para o veredicto. O nome do arquivo é arbitrário, mas aqui GamepadButtons está .

O script tem a seguinte aparência:

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

Depois de salvar o script, anexe-o e configure o objeto de texto de EventSystem exibição.

Tente executar o jogo e veja se cada botão responde.

A propósito, os botões a seguir são definidos como o mesmo botão, embora vários botões sejam preparados porque são lidos de forma diferente dependendo do console de jogo. Em cada um dos programas acima, um processo de julgamento é incluído, portanto, quando você pressiona o botão, três botões são exibidos.

Xbox,PlayStation e muito mais
bBotão circleButton buttonEast
aBotão Botão cruzado botãoSul
xBotão squareButton buttonWest
yButton triânguloBotão botãoNorte

O que pode ser julgado como um botão é o seguinte.

  • Um botão, × botão, botão para baixo
  • Botão B, botão ○, botão direito
  • Botão X, Botão □, Botão Esquerdo
  • Botão Y, botão de seta para baixo, botão para cima
  • Botão Iniciar, botão Menu
  • Botão Selecionar, Botão Exibir
  • Botão do ombro esquerdo, botão L1
  • Botão do ombro direito, botão R1
  • Botão do manípulo esquerdo
  • Botão do direcional direito

Determine se o botão está pressionado

O julgamento no momento da imprensa pode ser determinado pelas propriedades como com xxxxxxxx.wasPressedThisFrame o teclado e o mouse. Retorna o valor do momento true em que é pressionado e retorna mesmo se false for pressionado e mantido posteriormente.

Vamos exibir o botão pressionado como texto como uma verificação de operação. Coloque um objeto de texto para exibição.

O nome do arquivo do script pode ser qualquer coisa, mas aqui GamepadButtonsOneFrame está .

O script tem a seguinte aparência: Para simplificar, apenas 4 botões são julgados.

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

Depois de EventSystem salvar o script, anexe-o e defina um objeto de texto para exibição.

Tente executar o jogo e pressionar o botão. Acho que o botão que você pressionou será adicionado. Você também pode ver que manter pressionado o botão não adiciona nenhum texto.

Determine se o momento em que o botão é liberado

Não há amostra, mas você pode determinar se é wasPressedThisFrame o momento em que você liberá-lo usando uma propriedade em vez de wasReleasedThisFrame uma propriedade.

Determine quando você pressiona as teclas de seta

Determina a prensagem do DPAD. Dependendo do console de jogo, ele voará com as setas e o D-pad, mas ambos são tratados como iguais. O DPAD basicamente só determina se você está empurrando nessa direção ou não. Não há julgamento como "empurrar um pouco" como uma vara.

Coloca um objeto de texto para exibir uma decisão se ele é pressionado ou não como uma verificação de operação.

Crie um script. O nome do arquivo é arbitrário, mas aqui GamepadDpad está .

O script tem a seguinte aparência:

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

Você pode obter informações Gamepad.dpad sobre o DPAD em .

O DPAD tem leftupdown rightpropriedades para cada direção, e você pode determinar se ele é pressionado ou não pela propriedade etc. isPressed

DpadControl.ReadValue Você também pode usar o método para obter o estado Vector2 da imprensa em . Se nada for pressionado (0, 0), se a esquerda for pressionada (-1, 0) e assim por diante.

Depois de EventSystem salvar o script, anexe-o e defina um objeto de texto para exibição.

Tente executar o jogo e interagir com o DPAD.

Vector2 A propósito, está em um estado normalizado, então quando você pressiona diagonalmente, ele é obtido como um número como (0,7071, 0,7071) em vez de (1, 1).

Determinar pressionamentos de gatilho

Os controles Xbox têm botões chamados gatilhos à esquerda e à direita. No PlayStation, corresponde a L2R2. Este botão é diferente de um botão normal, e você pode obter a quantidade que você está pressionando em 0.0 ~ 1.0. Alguns outros controladores são equipados com nomes diferentes de gatilhos, mas em controladores mais antigos, etc., eles podem simplesmente ser colocados como botões, caso em que o julgamento de pressionar é tratado apenas como 0, 1.

Aqui, gostaria de verificar a quantidade de pressionamentos de gatilho. Coloca um objeto de texto para exibição no Canvas.

Crie um script. Uma vez que ele será usado em outro lugar, vamos nomeá-lo aqui GamepadReadValue .

O script tem a seguinte aparência:

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 tem uma propriedade e rightTrigger ReadValue você pode obter a quantidade de prensas no intervalo de 0,0 ~ 1,0 chamando o método. Os gatilhos também podem ser tratados como botões, para que isPressed você também possa julgar como. isPressed true A propósito, a quantidade de torna-se ReadValue é baseada em 0,5.

Depois de salvar o script, EventSystem anexe-o e defina um objeto de texto para exibição.

Tente executar o jogo e mover o gatilho.

Determinar informações de vara

O bastão pode obter as informações do bastão esquerdo e do bastão direito, respectivamente, e você pode obter a quantidade de quanto o bastão é empurrado para baixo em que direção. Claro, se você não tiver um stick no seu controle, você não será capaz de obter essa informação.

As informações do stick podem ser recuperadas com , Gamepad.rightStick respectivamenteGamepad.leftStick.

Para o script de confirmação de operação, desviaremos o script usado anteriormente para obter o gatilho.

// 省略

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 Você pode obter as informações de imprensa chamando o Vector2 método de ReadValue ou . Vector2 Assim, você pode obter o quanto x y você está pressionando o eixo X e o eixo Y por e propriedades, Se você quiser obter a direção que você está pressionando, você pode obtê-lo na propriedade, e se você quiser obter o valor que você está pressionando, você magnitude normalized pode obtê-lo na propriedade.

Tente realmente mover o jogo e operar o bastão.

Obter informações sobre o gamepad

Você pode obter o ID, nome, etc. do gamepad conectado. Por exemplo, consulte para identificar name o tipo de controlador que está conectado, ou Você pode consultar a qual deviceId gamepad associar quando vários gamepads estiverem conectados.

Aqui, vamos exibir as informações no texto para verificar a operação.

O nome do script é arbitrário, mas aqui GamepadInfo está.

O script tem a seguinte aparência:

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 Você pode obter várias informações do arquivo . Veja alguns trechos.

Depois de salvar o script, EventSystem anexe-o e defina um objeto de texto para exibição.

Tente executar o jogo para ver se as informações aparecem.