Funcionamiento con el teclado (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.
Determinar el momento en que se presiona una tecla específica
Cuando presione una tecla, intente mover el objeto. Coloque un objeto de texto en el lienzo para confirmar el movimiento. El tamaño y la posición pueden ser apropiados.
El manejo del teclado se realiza mediante scripts. KeyboardOneFrame
En este caso, lo creamos como .
El código se ve así:
using UnityEngine;
using UnityEngine.UI; // 追加
using UnityEngine.InputSystem; // 追加
public class KeyboardOneFrame : MonoBehaviour
{
<summary>移動させるテキストオブジェクト。</summary>
[SerializeField] private Text TextObject;
// 更新はフレームごとに1回呼び出されます
void Update()
{
if (TextObject == null)
{
Debug.Log($"{nameof(TextObject)} が null です。");
return;
}
// キーボードの情報を取得
var keyboard = Keyboard.current;
if (keyboard == null)
{
Debug.Log("キーボードがありません。");
return;
}
var transform = TextObject.transform;
// wasPressedThisFrame は押した瞬間のみ true となる
// キーは「keyboard[Key.RightArrow]」のような指定の仕方もある
if (keyboard.leftArrowKey.wasPressedThisFrame)
{
transform.Translate(-1, 0, 0);
}
if (keyboard.rightArrowKey.wasPressedThisFrame)
{
transform.Translate(1, 0, 0);
}
if (keyboard.upArrowKey.wasPressedThisFrame)
{
transform.Translate(0, 1, 0);
}
if (keyboard.downArrowKey.wasPressedThisFrame)
{
transform.Translate(0, -1, 0);
}
}
}
Keyboard.current
Puede obtener el estado actual de pulsación de la tecla del teclado, etc. desde .
keyboard.xxxxxxx.wasPressedThisFrame
Devuelve sólo true
el momento en que se pulsa la tecla.
En este código, en el momento en que se presiona la tecla del cursor, se realiza la operación Mover en el objeto transform
Text.
Dado que se procesa solo en el momento de presionar, el movimiento no continúa incluso si se presiona la tecla.
Después de EventSystem
guardar el script, adjúntelo al objeto KeyboardOneFrame
y haga clic en
Establezca el objeto de texto que se va a mover al objeto Text.
Intenta ejecutar el juego y comprueba si la marca @ se mueve cuando presionas la tecla del cursor. Además, asegúrese de que mantener presionada la tecla no mueva el símbolo @.
¿Qué tipos de claves se pueden determinar?
Está escrito en el sitio web oficial, así que por favor verifique allí.
Determinar el momento en que se libera una clave específica
No creamos una muestra, pero el momento en que la presiona está determinada por la propiedad, mientras que el momento wasPressedThisFrame
wasReleasedThisFrame
en que la libera puede ser juzgada por .
Determinar mientras se presiona una tecla específica
Esto también está determinado por el guión. Puede agregarlo al código anterior, pero esta vez crearemos un nuevo archivo de script llamado y lo KeyboardPress
escribiremos .
El script tiene este aspecto:
using UnityEngine;
using UnityEngine.UI; // 追加
using UnityEngine.InputSystem; // 追加
public class KeyboardPress : MonoBehaviour
{
<summary>回転させるテキストオブジェクト。</summary>
[SerializeField] private Text TextObject;
// 更新はフレームごとに1回呼び出されます
void Update()
{
if (TextObject == null)
{
Debug.Log($"{nameof(TextObject)} が null です。");
return;
}
// キーボードの情報を取得
var keyboard = Keyboard.current;
if (keyboard == null)
{
Debug.Log("キーボードがありません。");
return;
}
var transform = TextObject.transform;
// isPressed は押している間はずっと true となる
// キーは「Keyboard.current[Key.Space]」のような指定の仕方もある
if (keyboard.spaceKey.isPressed)
{
transform.Rotate(0, 0, 1);
}
}
}
Mientras se presiona la barra espaciadora, se gira el objeto de texto.
keyboard.xxxxxxxx.isPressed
Devuelve durante toda true
la duración de la clave.
Adjunte el script guardado al objeto de texto y establezca el EventSystem
objeto de texto que se va a rotar.
Asegúrate de que el símbolo @ gire completamente mientras el juego se ejecuta y mantiene presionada la barra espaciadora.
Obtener todas las teclas presionadas
Intente mostrar todas las teclas que está presionando como texto. Ha colocado un objeto de texto para mostrar la tecla que está presionando.
KeyboardAllKeys
Cree un script con el nombre .
El script tiene este aspecto:
using System.Linq;
using UnityEngine;
using UnityEngine.InputSystem; // 追加
using UnityEngine.UI; // 追加
public class KeyboardAllKeys : MonoBehaviour
{
<summary>移動させるテキストオブジェクト。</summary>
[SerializeField] private Text TextObject;
// 更新はフレームごとに1回呼び出されます
void Update()
{
if (TextObject == null)
{
Debug.Log($"{nameof(TextObject)} が null です。");
return;
}
// キーボードの情報を取得
var keyboard = Keyboard.current;
if (keyboard == null)
{
Debug.Log("キーボードがありません。");
TextObject.text = "";
return;
}
// allKeys からすべてのキーの情報を走査し isPressed で押しているキーのみを抽出する
TextObject.text = string.Join(", ", keyboard.allKeys.Where(x => x.isPressed).Select(x => x.keyCode.ToString()));
}
}
keyboard.allKeys
le permite obtener información sobre todas las claves.
Puede extraer solo aquellos que son verdaderos de isPressed
esas teclas y recuperar solo las teclas que está presionando.
Después de eso, la tecla que está presionando se convierte en una cadena y se muestra como texto.
El EventSystem
script creado adjunta y establece un objeto de texto para mostrar la tecla de presión.
Ejecuta el juego y comprueba que aparece la tecla que estás presionando.
Por cierto, incluso si presiona muchas teclas, es posible que no se muestren todas las teclas, pero no se preocupe porque es un problema físico debido al cableado del teclado.
Obtener caracteres escritos
Hasta ahora, obtenía el tipo de tecla que presionó, pero también es posible obtener los caracteres que realmente escribió. Por ejemplo, si se presiona la tecla "A", se puede obtener la letra "a", y si se presiona la tecla "Mayús + A", se puede obtener la letra "A". Si el IME está habilitado, es posible que también pueda recuperar japonés.
Sin embargo, estos caracteres introducidos no se pueden recuperar en las propiedades y se adquirirán en forma de eventos.
En el ejemplo, se coloca un objeto de texto para mostrar los caracteres introducidos.
Cree un script. KeyboardTextInput
El nombre es .
Introduzca el script de la siguiente manera:
using UnityEngine;
using UnityEngine.InputSystem; // 追加
using UnityEngine.UI; // 追加
public class KeyboardTextInput : MonoBehaviour
{
<summary>移動させるテキストオブジェクト。</summary>
[SerializeField] private Text TextObject;
<summary>
オブジェクトが有効になったときに呼ばれるイベント。
</summary>
public void OnEnable()
{
// 文字が入力されたときに呼ばれるイベントをセット
Keyboard.current.onTextInput += OnTextInput;
}
<summary>
オブジェクトが無効になったときに呼ばれるイベント。
</summary>
public void OnDisable()
{
// 文字が入力されたときに呼ばれるイベントを解除
Keyboard.current.onTextInput -= OnTextInput;
}
<summary>
文字を入力するたびに呼ばれる。
</summary>
<param name="c">入力された文字。</param>
public void OnTextInput(char c)
{
TextObject.text += c;
}
}
Keyboard
La onTextInput
clase tiene un evento llamado , al que se llama siempre que se introduce texto.
OnEnable
Aquí, el método se registra en el momento de yOnDisable
se cancela en OnTextInput
OnTextInput
el momento de .
Keyboard.current
es un objeto único que existe desde el momento en que se ejecuta el juego hasta que termina, así que OnDisable
asegúrate de liberarlo en el momento de .
Si siempre puede emparejar el registro y la cancelación del evento, puede configurarlo en cualquier otro momento.
OnTextInput
En el método, el carácter introducido se establece como un argumento c
, por lo que se anexa como texto.
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 la tecla. Debería ver los caracteres introducidos. Si lo presiona al mismo tiempo que la tecla Mayús, debería poder ingresar letras mayúsculas y símbolos. También puede escribir japonés si el IME está habilitado. Por otro lado, si presiona una tecla que no es de caracteres, como la tecla del cursor, no sucederá nada.