Ovládanie pomocou klávesnice (verzia vstupného systémového balíka)

Stránka aktualizovaná :
Dátum vytvorenia strany :

Prostredie overovania

Windows
  • Windows 11
Editor jednoty
  • 2020.3.25f1
Vstupný systémový balík
  • 1.2.0

Predpoklady pre tento tip

Nasledujúce nastavenia boli vykonané vopred ako predpoklad pre popis tohto tipu.

Určenie okamihu stlačenia konkrétneho klávesu

Keď stlačíte kláves, skúste objekt presunúť. Umiestnením textového objektu na plátno potvrďte presun. Veľkosť a poloha môžu byť primerané.

Manipulácia s klávesnicou sa vykonáva pomocou skriptov. KeyboardOneFrame V tomto prípade ho vytvoríme ako .

Kód vyzerá 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álny stav klávesu klávesnice atď. môžete získať z . keyboard.xxxxxxx.wasPressedThisFrame Vráti iba true načasovanie okamihu stlačenia klávesu. V tomto kóde sa v okamihu stlačenia kurzora vykoná operácia Presunúť na textovom objekte transform . Pretože sa spracováva iba v okamihu stlačenia, pohyb nepokračuje ani po stlačení klávesu.

Po EventSystem uložení skriptu pripojte k objektu KeyboardOneFrame a kliknite na Nastavte textový objekt, ktorý sa má premiestniť do textového objektu.

Skúste spustiť hru a skontrolovať, či sa znak @ pohybuje po stlačení kurzora. Uistite sa tiež, že podržaním klávesu sa nepohne symbolom @.

Aké typy kľúčov je možné určiť?

Je to napísané na oficiálnych webových stránkach, takže si to prosím skontrolujte.

Určenie okamihu uvoľnenia konkrétneho kľúča

Vzorku nevytvoríme, ale okamih, keď ju stlačíte, je určený vlastnosťou, zatiaľ čo okamih, keď wasPressedThisFrame wasReleasedThisFrame ju uvoľníte, môže byť posúdený podľa .

Určenie počas stlačenia konkrétneho klávesu

To je tiež určené skriptom. Môžete ho pridať do predchádzajúceho kódu, ale tentokrát vytvoríme nový súbor skriptu s názvom a napíšeme ho KeyboardPress .

Skript vyzerá 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);
    }
  }
}

Počas stlačenia medzerníka sa textový objekt otočí. keyboard.xxxxxxxx.isPressed vráti hodnotu počas celého true trvania kľúča.

Pripojte EventSystem uložený skript k textovému objektu a nastavte otočenie textového objektu.

Skontrolujte, či sa symbol @ úplne otáča, keď je hra spustená a drží medzerník.

Získajte všetky stlačené klávesy

Pokúste sa zobraziť všetky klávesy, ktoré stláčate, ako text. Umiestnili ste textový objekt na zobrazenie klávesu, ktorý stláčate.

KeyboardAllKeys Vytvorte skript s názvom .

Skript vyzerá 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ískať informácie o všetkých kľúčoch. Z isPressed týchto klávesov môžete extrahovať iba tie, ktoré sú pravdivé, a načítať iba klávesy, ktoré stláčate. Potom sa kláves, ktorý stláčate, prevedie na reťazec a zobrazí sa ako text.

Vytvorený EventSystem skript sa pripojí a nastaví textový objekt na zobrazenie stlačenia klávesu.

Spustite hru a overte, či sa zobrazuje kláves, ktorý stláčate.

Mimochodom, aj keď stlačíte veľa klávesov, všetky klávesy sa nemusia zobraziť, ale nebojte sa o to, pretože ide o fyzický problém v dôsledku zapojenia klávesnice.

Získanie napísaných znakov

Doteraz ste dostali typ klávesu, ktorý ste stlačili, ale je tiež možné získať znaky, ktoré ste skutočne zadali. Napríklad, ak stlačíte kláves "A", je možné získať písmeno "a" a ak stlačíte kláves "Shift + A", je možné získať písmeno "A". Ak je editor IME povolený, môžete získať aj japončinu.

Tieto zadané znaky však nie je možné získať vo vlastnostiach a získajú sa vo forme udalostí.

Vo vzorke je umiestnený textový objekt na zobrazenie zadaných znakov.

Vytvorte skript. KeyboardTextInput Názov je .

Zadajte skript nasledovne:

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

KeyboardTrieda onTextInput má udalosť s názvom , ktorá sa volá vždy, keď je zadaný text. OnEnable Tu je metóda zaznamenaná v čase aOnDisable zrušená v OnTextInput OnTextInput čase . Keyboard.current je jedinečný objekt, ktorý existuje od okamihu spustenia hry až do jej ukončenia, takže OnDisable ho nezabudnite vydať v čase . Ak môžete registráciu a zrušenie udalosti vždy spárovať, môžete ju nastaviť kedykoľvek inokedy.

OnTextInput V metóde je zadaný znak nastavený ako argument c , takže je pripojený ako text.

Po EventSystem uložení skriptu ho pripojte a nastavte textový objekt na zobrazenie.

Skúste spustiť hru a stlačiť kláves. Mali by ste vidieť zadané znaky. Ak ho stlačíte súčasne s klávesom Shift, mali by ste byť schopní zadať veľké písmená a symboly. Ak je editor IME povolený, môžete zadať aj japončinu. Na druhej strane, ak stlačíte kláves, ktorý nie je znakom, napríklad kláves kurzora, nič sa nestane.