Controlando com um Gamepad (Versão do Pacote do Sistema de Entrada)
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 left
up
down
right
propriedades 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 leftTrigger
classe 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();
}
}
leftStick
rightStick
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.