Werken met het toetsenbord (Input System Package Version)

Pagina bijgewerkt :
Aanmaakdatum van pagina :

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

KeyboardDe 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.