Operando com o teclado (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.
Determinar o momento em que uma tecla específica é pressionada
Quando você pressiona uma tecla, tente mover o objeto. Coloque um objeto de texto no Canvas para confirmar a movimentação. O tamanho e a posição podem ser apropriados.
O manuseio do teclado é feito por scripts. KeyboardOneFrame
Neste caso, nós o criamos como .
O código tem a seguinte aparência:
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
Você pode obter o status atual da tecla do teclado, etc. do .
keyboard.xxxxxxx.wasPressedThisFrame
Retorna apenas true
o tempo do momento em que a tecla é pressionada.
Nesse código, no momento em que a tecla do cursor é pressionada, a operação Mover é executada no objeto transform
Text .
Como ele é processado apenas no momento da prensagem, o movimento não continua mesmo se a tecla for pressionada.
Depois de EventSystem
salvar o script, anexe ao objeto KeyboardOneFrame
e clique em
Defina o objeto de texto a ser movido para o objeto Text.
Tente executar o jogo e verificar se a marca @ se move quando você pressiona a tecla do cursor. Além disso, certifique-se de manter pressionada a tecla não move o símbolo @.
Que tipos de chaves podem ser determinados?
Está escrito no site oficial, então por favor, verifique lá.
Determinar o momento em que uma chave específica é liberada
Nós não criamos uma amostra, mas o momento em que você pressiona é determinado pela propriedade, enquanto o momento wasPressedThisFrame
wasReleasedThisFrame
em que você a libera pode ser julgado pelo .
Determinar ao pressionar uma tecla específica
Isso também é determinado pelo script. Você pode adicioná-lo ao código anterior, mas desta vez vamos criar um novo arquivo de script chamado e escrevê-lo KeyboardPress
.
O script tem a seguinte aparência:
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);
}
}
}
Enquanto a barra de espaço é pressionada, o objeto de texto é girado.
keyboard.xxxxxxxx.isPressed
retorna para toda true
a duração da chave.
Anexe o script salvo ao Objeto de Texto e defina o EventSystem
objeto de texto a ser girado.
Certifique-se de que o símbolo @ gira todo o caminho enquanto o jogo está em execução e segurando a barra de espaço.
Obter todas as teclas pressionadas
Tente exibir todas as teclas que você está pressionando como texto. Você colocou um objeto de texto para exibir a tecla que está pressionando.
KeyboardAllKeys
Crie um script com o nome .
O script tem a seguinte aparência:
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
permite que você obtenha informações sobre todas as chaves.
Você pode extrair somente as que são verdadeiras dessas isPressed
teclas e recuperar apenas as teclas que você está pressionando.
Depois disso, a tecla que você está pressionando é convertida em uma cadeia de caracteres e exibida como texto.
O EventSystem
script criado anexa e define um objeto de texto para exibir a tecla de pressionamento.
Execute o jogo e verifique se a tecla que você está pressionando aparece.
A propósito, mesmo que você pressione muitas teclas, todas as teclas podem não ser exibidas, mas não se preocupe com isso, porque é um problema físico devido à fiação do teclado.
Obter caracteres digitados
Até agora, você tinha o tipo de tecla que pressionava, mas também é possível obter os caracteres que você realmente digitou. Por exemplo, se a tecla "A" é pressionada, a letra "a" pode ser obtida, e se a tecla "Shift+A" é pressionada, a letra "A" pode ser obtida. Se o IME estiver habilitado, você também poderá recuperar o japonês.
No entanto, esses caracteres inseridos não podem ser recuperados em propriedades e serão adquiridos na forma de eventos.
No exemplo, um objeto de texto é colocado para exibir os caracteres inseridos.
Crie um script. KeyboardTextInput
O nome é .
Digite o script da seguinte maneira:
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
A onTextInput
classe tem um evento chamado , que é chamado sempre que o texto é inserido.
OnEnable
Aqui, o método é registrado no momento de eOnDisable
cancelado no OnTextInput
OnTextInput
momento de .
Keyboard.current
é um objeto único que existe desde o momento em que o jogo é executado até que ele seja encerrado, então OnDisable
certifique-se de liberá-lo no momento do .
Se você sempre pode emparelhar o registro e o cancelamento do evento, você pode defini-lo a qualquer outro momento.
OnTextInput
No método, o caractere inserido é definido como um argumento c
, portanto, ele é acrescentado como texto.
Depois de EventSystem
salvar o script, anexe-o e defina um objeto de texto para exibição.
Tente executar o jogo e pressionar a tecla. Você deve ver os caracteres inseridos. Se você pressioná-lo ao mesmo tempo que a tecla Shift, você deve ser capaz de inserir letras maiúsculas e símbolos. Você também pode inserir japonês se o IME estiver habilitado. Por outro lado, se você pressionar uma tecla que não seja de caractere, como a tecla do cursor, nada acontecerá.