Práce s klávesnicí (verze vstupního systémového balíčku)
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;
}
}
Keyboard
Tří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.