Ovládanie pomocou klávesnice (verzia vstupného systémového balíka)
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;
}
}
Keyboard
Trieda 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.