Werken met het toetsenbord (Input System Package Version)
Verificatieomgeving
- Ramen
-
- Voor Windows 11
- Unity Editor
-
- 2020.3.25f1
- Input systeem pakket
-
- 1.2.0
Vereisten voor deze tip
De volgende instellingen zijn vooraf gemaakt als uitgangspunt voor de beschrijving van deze tip.
Bepaal het moment waarop een specifieke toets wordt ingedrukt
Wanneer u op een toets drukt, probeert u het object te verplaatsen. Plaats een tekstobject in het canvas om de verplaatsing te bevestigen. De grootte en positie kunnen geschikt zijn.
Toetsenbordverwerking wordt gedaan door scripts. KeyboardOneFrame
In dit geval maken we het als .
De code ziet er als volgt uit:
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
U kunt de huidige toetsenbordtoetsindrukstatus enz. krijgen van .
keyboard.xxxxxxx.wasPressedThisFrame
Retourneert alleen true
de timing van het moment waarop de toets wordt ingedrukt.
In deze code wordt, op het moment dat de cursortoets wordt ingedrukt, de bewerking Verplaatsen uitgevoerd op het object transform
Text .
Omdat het alleen wordt verwerkt op het moment van indrukken, gaat de beweging niet door, zelfs niet als de toets wordt ingedrukt.
Nadat u het script hebt opgeslagen, koppelt u het aan het object KeyboardOneFrame
en klikt u EventSystem
op
Stel het tekstobject in dat naar het object Text moet worden verplaatst.
Probeer het spel uit te voeren en controleer of het @-teken beweegt wanneer u op de cursortoets drukt. Zorg er ook voor dat het ingedrukt houden van de toets het @-symbool niet verplaatst.
Welke soorten sleutels kunnen worden bepaald?
Het staat op de officiële website, dus kijk daar.
Bepaal het moment waarop een specifieke sleutel wordt vrijgegeven
We maken geen monster, maar het moment waarop u erop drukt, wordt bepaald door de eigenschap, terwijl het moment wasPressedThisFrame
wasReleasedThisFrame
waarop u het loslaat, kan worden beoordeeld door .
Bepalen terwijl u op een specifieke toets drukt
Dit wordt ook bepaald door het script. U kunt het toevoegen aan de vorige code, maar deze keer zullen we een nieuw scriptbestand maken met de naam en het KeyboardPress
schrijven .
Het script ziet er als volgt uit:
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);
}
}
}
Terwijl op de spatiebalk wordt gedrukt, wordt het tekstobject geroteerd.
keyboard.xxxxxxxx.isPressed
retourneert voor de gehele true
duur van de sleutel.
Koppel het opgeslagen script aan Tekstobject en stel in dat het EventSystem
tekstobject wordt geroteerd.
Zorg ervoor dat het @-symbool helemaal draait terwijl het spel wordt uitgevoerd en houd de spatiebalk vast.
Krijg alle ingedrukte toetsen
Probeer alle toetsen die u indrukt als tekst weer te geven. U hebt een tekstobject geplaatst om de toets weer te geven waarop u drukt.
KeyboardAllKeys
Maak een script met de naam .
Het script ziet er als volgt uit:
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
Hiermee kunt u informatie krijgen over alle sleutels.
U kunt alleen die toetsen extraheren die waar isPressed
zijn en alleen de toetsen ophalen die u indrukt.
Daarna wordt de toets die u indrukt omgezet in een tekenreeks en weergegeven als tekst.
Het EventSystem
gemaakte script wordt gekoppeld aan en stelt een tekstobject in voor het weergeven van de druktoets.
Voer het spel uit en controleer of de toets waarop u drukt wordt weergegeven.
Trouwens, zelfs als je op veel toetsen drukt, worden mogelijk niet alle toetsen weergegeven, maar maak je er geen zorgen over, want het is een fysiek probleem als gevolg van toetsenbordbedrading.
Getypte tekens ophalen
Tot nu toe kreeg je het type toets dat je indrukte, maar het is ook mogelijk om de tekens te krijgen die je daadwerkelijk hebt getypt. Als bijvoorbeeld de "A" -toets wordt ingedrukt, kan de letter "a" worden verkregen en als de "Shift + A" -toets wordt ingedrukt, kan de letter "A" worden verkregen. Als de IME is ingeschakeld, kunt u mogelijk ook Japans ophalen.
Deze ingevoerde tekens kunnen echter niet worden opgehaald in eigenschappen en worden verkregen in de vorm van gebeurtenissen.
In het voorbeeld wordt een tekstobject geplaatst om de ingevoerde tekens weer te geven.
Maak een script. KeyboardTextInput
De naam is .
Voer het script als volgt 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
De onTextInput
klasse heeft een gebeurtenis met de naam , die wordt aangeroepen wanneer tekst wordt ingevoerd.
OnEnable
Hier wordt de methode geregistreerd op het moment van enOnDisable
geannuleerd op OnTextInput
OnTextInput
het moment van .
Keyboard.current
is een uniek object dat bestaat vanaf het moment dat het spel wordt uitgevoerd totdat het wordt beëindigd, dus OnDisable
zorg ervoor dat u het vrijgeeft op het moment van .
Als je registratie en annulering van evenementen altijd kunt koppelen, kun je dit op elk ander moment instellen.
OnTextInput
In de methode wordt het ingevoerde teken ingesteld als een argument c
, dus het wordt toegevoegd als tekst.
Nadat u EventSystem
het script hebt opgeslagen, koppelt u het aan en stelt u een tekstobject in voor weergave.
Probeer het spel uit te voeren en op de toets te drukken. U zou de ingevoerde tekens moeten zien. Als u er tegelijkertijd met de Shift-toets op drukt, moet u hoofdletters en symbolen kunnen invoeren. U kunt ook Japans invoeren als de IME is ingeschakeld. Aan de andere kant, als u op een niet-tekentoets drukt, zoals de cursortoets, gebeurt er niets.