Práce s klávesnicí (verze vstupního systémového balíčku)

Stránky aktualizovány :
Datum vytvoření stránky :

Ověřovací prostředí

Windows
  • Systém Windows 11
Editor jednoty
  • 2020.3.25f1
Vstupní systémový balíček
  • 1.2.0

Předpoklady pro tento tip

Následující nastavení byla provedena předem jako předpoklad pro popis tohoto tipu.

Určení okamžiku stisknutí určité klávesy

Po stisknutí klávesy zkuste objekt přesunout. Umístěním textového objektu na plátno potvrďte přesun. Velikost a umístění mohou být vhodné.

Manipulace s klávesnicí se provádí pomocí skriptů. KeyboardOneFrame V tomto případě jej vytvoříme jako .

Kód vypadá takto:

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 Aktuální stav stisknutí klávesnice atd. můžete získat z . keyboard.xxxxxxx.wasPressedThisFrame Vrátí pouze true okamžik stisknutí klávesy. V tomto kódu, v okamžiku stisknutí kurzorové klávesy, operace Move se provádí na objektu transform Text . Vzhledem k tomu, že je zpracován pouze v okamžiku stisknutí, pohyb nepokračuje, i když je stisknut klíč.

Po EventSystem uložení skriptu připojte k objektu KeyboardOneFrame a klikněte na Nastavte textový objekt, který chcete přesunout do objektu Text.

Zkuste spustit hru a zkontrolovat, zda se značka @ po stisknutí kurzorové klávesy pohne. Také se ujistěte, že podržením klávesy nedojde k přesunutí symbolu @.

Jaké typy klíčů lze určit?

Je to napsáno na oficiálních stránkách, takže se tam prosím podívejte.

Určení okamžiku uvolnění konkrétního klíče

Vzorek nevytvoříme, ale okamžik, kdy ho stisknete, je určen vlastností, zatímco okamžik, kdy wasPressedThisFrame wasReleasedThisFrame jej uvolníte, může být posuzován podle .

Určení při stisknutí určité klávesy

To je také určeno skriptem. Můžete jej přidat do předchozího kódu, ale tentokrát vytvoříme nový soubor skriptu s názvem a zapíšeme jej KeyboardPress .

Skript vypadá takto:

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

Při stisknutí mezerníku se textový objekt otočí. keyboard.xxxxxxxx.isPressed se vrátí po celou true dobu trvání klíče.

Připojte uložený EventSystem skript k textovému objektu a nastavte textový objekt, který se má otočit.

Ujistěte se, že se symbol @ otáčí celou cestu, když je hra spuštěna a drží mezerník.

Získejte všechny stisknuté klávesy

Pokuste se zobrazit všechny klávesy, které tisknete, jako text. Umístili jste textový objekt, aby se zobrazila klávesa, kterou stisknete.

KeyboardAllKeys Vytvořte skript s názvem .

Skript vypadá takto:

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 umožňuje získat informace o všech klíčích. Z isPressed těchto kláves můžete extrahovat pouze ty, které jsou pravdivé, a načíst pouze klávesy, které stisknete. Poté je klávesa, kterou stisknete, převedena na řetězec a zobrazena jako text.

Vytvořený EventSystem skript se připojí a nastaví textový objekt pro zobrazení stisknuté klávesy.

Spusťte hru a ověřte, zda se zobrazí klávesa, kterou stisknete.

Mimochodem, i když stisknete spoustu kláves, všechny klávesy nemusí být zobrazeny, ale nebojte se o to, protože je to fyzický problém kvůli zapojení klávesnice.

Získání zadaných znaků

Až dosud jste dostali typ klávesy, kterou jste stiskli, ale je také možné získat znaky, které jste skutečně napsali. Pokud je například stisknuta klávesa "A", lze získat písmeno "a" a pokud je stisknuta klávesa "Shift + A", lze získat písmeno "A". Pokud je editor IME povolen, je pravděpodobně možné načíst také japonštinu.

Tyto zadané znaky však nelze načíst ve vlastnostech a budou získány ve formě událostí.

V ukázce je umístěn textový objekt, který zobrazí zadané znaky.

Vytvořte skript. KeyboardTextInput Jmenuje se .

Zadejte skript následujícím způsobem:

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

KeyboardTřída onTextInput má událost nazvanou , která je volána při každém zadání textu. OnEnable Zde je metoda registrována v čase aOnDisable zrušena v OnTextInput OnTextInput čase . Keyboard.current je jedinečný objekt, který existuje od okamžiku spuštění hry až do jejího ukončení, takže OnDisable jej nezapomeňte uvolnit v načasování . Pokud můžete vždy spárovat registraci a zrušení akce, můžete ji nastavit kdykoli jindy.

OnTextInput V metodě je zadaný znak nastaven jako argument c , takže je připojen jako text.

Po EventSystem uložení skriptu jej připojte a nastavte textový objekt pro zobrazení.

Zkuste spustit hru a stisknout klávesu. Měli byste vidět zadané znaky. Pokud jej stisknete současně s klávesou Shift, měli byste být schopni zadávat velká písmena a symboly. Můžete také zadat japonštinu, pokud je editor IME povolen. Na druhou stranu, pokud stisknete neznakovou klávesu, jako je kurzorová klávesa, nic se nestane.