Upravljanje s tipkovnico (različica paketa vhodnega sistema)
Okolje za preverjanje
- Windows
-
- Windows 11
- Urejevalnik Unity
-
- 2020.3.25F1
- Paket vhodnega sistema
-
- 1.2.0
Predpogoji za ta nasvet
Naslednje nastavitve so bile vnaprej narejene kot premisa za opis tega nasveta.
Določanje trenutka, ko pritisnete določeno tipko
Ko pritisnete tipko, poskusite premakniti predmet. Postavite besedilni predmet v platno, da potrdite premik. Velikost in položaj sta lahko primerna.
Ravnanje s tipkovnico poteka s skripti. KeyboardOneFrame
V tem primeru ga ustvarimo kot .
Koda izgleda takole:
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
Trenutno tipko na tipkovnici, pritisnite stanje itd. lahko dobite iz .
keyboard.xxxxxxx.wasPressedThisFrame
Vrne le true
čas trenutka, ko pritisnete tipko.
V tej kodi se v trenutku, ko pritisnete tipko kazalca, izvede operacija Premakni na predmetu transform
Besedilo .
Ker se obdeluje samo v trenutku pritiska, se gibanje ne nadaljuje, tudi če pritisnete tipko.
Ko EventSystem
shranite skript, ga priložite predmetu KeyboardOneFrame
in kliknite
Nastavite besedilni predmet, ki ga želite premakniti v predmet Besedilo.
Poskusite zagnati igro in preveriti, ali se oznaka @ premakne, ko pritisnete tipko kazalca. Prav tako se prepričajte, da držanje tipke ne premakne simbola @.
Katere vrste ključev je mogoče določiti?
Napisano je na uradni spletni strani, zato preverite tam.
Določite trenutek, ko je določen ključ sproščen
Vzorca ne ustvarimo, vendar trenutek, ko ga pritisnete, določi nastanitev, medtem ko lahko trenutek, ko wasPressedThisFrame
wasReleasedThisFrame
ga sprostite, presodi .
Določanje s pritiskom določene tipke
To določa tudi scenarij. Lahko ga dodate prejšnji kodi, vendar bomo tokrat ustvarili novo skriptno datoteko, imenovano in jo KeyboardPress
napisali .
Scenarij izgleda takole:
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);
}
}
}
Ko pritisnete preslednico, se besedilni predmet zasuka.
keyboard.xxxxxxxx.isPressed
vrne za celotno true
trajanje ključa.
Shranjeni skript priložite predmetu EventSystem
besedila in nastavite predmet besedila, ki ga želite zasukati.
Prepričajte se, da se simbol @ vrti do konca, medtem ko se igra izvaja in drži preslednico.
Pridobite vse pritisnjene tipke
Poskusite prikazati vse tipke, ki jih pritiskate, kot besedilo. Postavili ste besedilni predmet, da prikažete tipko, ki jo pritisnete.
KeyboardAllKeys
Ustvarite skript z imenom .
Scenarij izgleda takole:
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
vam omogoča, da dobite informacije o vseh ključih.
Iz isPressed
teh tipk lahko izvlečete samo tiste, ki so resnične, in pridobite samo tipke, ki jih pritisnete.
Po tem se tipka, ki jo pritisnete, pretvori v niz in prikaže kot besedilo.
Ustvarjeni EventSystem
skript priloži in nastavi besedilni predmet za prikaz tipke za pritisk.
Zaženite igro in preverite, ali se prikaže tipka, ki jo pritisnete.
Mimogrede, tudi če pritisnete veliko tipk, vse tipke morda ne bodo prikazane, vendar ne skrbite, ker je to fizična težava zaradi ožičenja tipkovnice.
Prejemanje tipkanih znakov
Do zdaj ste dobili vrsto tipke, ki ste jo pritisnili, vendar je mogoče dobiti tudi znake, ki ste jih dejansko vnesli. Na primer, če pritisnete tipko "A", lahko dobite črko "a", in če pritisnete tipko "Shift + A", lahko dobite črko "A". Če je urejevalnik vnosne metode omogočen, boste morda lahko pridobili tudi japonščino.
Vendar teh vnesenih znakov ni mogoče pridobiti v lastnostih in bodo pridobljeni v obliki dogodkov.
V vzorcu je postavljen besedilni predmet za prikaz vnesenih znakov.
Ustvarite skript. KeyboardTextInput
Ime je .
Vnesite skript na naslednji način:
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
Razred onTextInput
ima dogodek, imenovan , ki se imenuje vsakič, ko vnesete besedilo.
OnEnable
Tu se metoda registrira ob času inOnDisable
prekliče ob OnTextInput
OnTextInput
času .
Keyboard.current
je edinstven predmet, ki obstaja od trenutka, ko se igra izvede, do zaključka, zato OnDisable
jo sprostite ob času .
Če lahko registracijo in preklic dogodka kadar koli seznanite, ga lahko nastavite kadar koli.
OnTextInput
V metodi je vneseni znak nastavljen kot argument c
, zato je dodan kot besedilo.
Ko EventSystem
shranite skript, ga priložite in nastavite besedilni predmet za prikaz.
Poskusite zagnati igro in pritisniti tipko. Vneseni znaki bi morali biti prikazani. Če jo pritisnete hkrati s tipko Shift, boste lahko vnesli velike črke in simbole. Japonščino lahko vnesete tudi, če je urejevalnik vnosne metode omogočen. Če pa pritisnete tipko brez znakov, kot je tipka kazalca, se ne bo nič zgodilo.