Operando com o teclado (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.

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

KeyboardA 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á.