Control con un Gamepad (versión del paquete del sistema de entrada)
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.
Xbox | PlayStation | 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 left
up
down
right
propiedades 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 leftTrigger
clase 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();
}
}
leftStick
rightStick
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.