Betjening med tastaturet (version af inputsystempakke)

Side opdateret :
Dato for oprettelse af side :

Miljø til bekræftelse

Windows
  • Windows 11
Enhedslistens redaktør
  • 2020.3.25f1
Input System Pakke
  • 1.2.0

Forudsætninger for dette tip

Følgende indstillinger er foretaget på forhånd som en forudsætning for beskrivelsen af dette tip.

Bestem det øjeblik, der trykkes på en bestemt tast

Når du trykker på en tast, skal du prøve at flytte objektet. Placer et tekstobjekt på lærredet for at bekræfte flytningen. Størrelsen og placeringen kan være passende.

Tastaturhåndtering udføres af scripts. KeyboardOneFrame I dette tilfælde opretter vi det som .

Koden ser sådan ud:

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 Du kan få den aktuelle tastaturtast, pressestatus osv. fra. keyboard.xxxxxxx.wasPressedThisFrame returnerer kun true timingen i det øjeblik, der trykkes på tasten. I denne kode, i det øjeblik der trykkes på markørtasten, udføres Flyt operationen på tekstobjektet transform . Da den kun behandles i trykkeøjeblikket, fortsætter bevægelsen ikke, selvom der trykkes på tasten.

Når EventSystem du har gemt scriptet, skal du vedhæfte det til objektet KeyboardOneFrame og klikke på Indstil tekstobjektet, der skal flyttes til tekstobjektet.

Prøv at køre spillet og kontroller, om @-mærket bevæger sig, når du trykker på piletasten. Sørg også for, at du ikke flytter @-symbolet, når du holder tasten nede.

Hvilke typer nøgler kan bestemmes?

Det er skrevet på den officielle hjemmeside, så tjek venligst der.

Bestem det øjeblik, en bestemt nøgle frigives

Vi opretter ikke en prøve, men det øjeblik, du trykker på den, bestemmes af egenskaben, mens det øjeblik wasPressedThisFrame wasReleasedThisFrame , du slipper den, kan bedømmes af .

Bestem, mens du trykker på en bestemt tast

Dette bestemmes også af scriptet. Du kan tilføje den til den forrige kode, men denne gang opretter vi en ny scriptfil kaldet og skriv den KeyboardPress .

Scriptet ser sådan ud:

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

Mens der trykkes på mellemrumstasten, roteres tekstobjektet. keyboard.xxxxxxxx.isPressed returnerer for hele true nøglens varighed.

Vedhæft det EventSystem gemte script til tekstobjektet, og indstil tekstobjektet til at blive roteret.

Sørg for, at @-symbolet roterer hele vejen, mens spillet kører, og hold mellemrumstasten nede.

Få alle taster, der trykkes på

Prøv at vise alle de taster, du trykker på, som tekst. Du har placeret et tekstobjekt for at vise den tast, du trykker på.

KeyboardAllKeys Opret et script med navnet .

Scriptet ser sådan ud:

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 giver dig mulighed for at få oplysninger om alle nøgler. Du kan kun udtrække dem, der er sande, fra isPressed disse taster og kun hente de taster, du trykker på. Derefter konverteres tasten, du trykker på, til en streng og vises som tekst.

Det EventSystem oprettede script vedhæfter og indstiller et tekstobjekt til visning af tryktasten.

Kør spillet, og kontroller, at den tast, du trykker på, vises.

Forresten, selvom du trykker på mange taster, vises alle tasterne muligvis ikke, men bekymre dig ikke om det, fordi det er et fysisk problem på grund af tastaturledninger.

Hent indtastede tegn

Indtil nu har du fået den type tast, du trykkede på, men det er også muligt at få de tegn, du faktisk skrev. For eksempel, hvis der trykkes på "A" -tasten, kan bogstavet "a" opnås, og hvis der trykkes på "Shift + A" -tasten, kan bogstavet "A" opnås. Hvis IME'en er aktiveret, kan du muligvis også hente japansk.

Disse indtastede tegn kan dog ikke hentes i egenskaber og vil blive erhvervet i form af begivenheder.

I eksemplet placeres et tekstobjekt for at vise de indtastede tegn.

Opret et script. KeyboardTextInput Navnet er .

Indtast scriptet som følger:

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

KeyboardKlassen onTextInput har en begivenhed kaldet , som kaldes, når der indtastes tekst. OnEnable Her registreres metoden på tidspunktet for ogOnDisable annulleres på OnTextInput OnTextInput tidspunktet for . Keyboard.current er et unikt objekt, der eksisterer fra det tidspunkt, hvor spillet udføres, indtil det afsluttes, så OnDisable sørg for at frigive det på tidspunktet for . Hvis du altid kan parre begivenhedstilmelding og aflysning, kan du indstille det til enhver tid.

OnTextInput I metoden indstilles det indtastede tegn som et argument c , så det tilføjes som tekst.

Når EventSystem du har gemt scriptet, skal du vedhæfte det til og indstille et tekstobjekt til visning.

Prøv at køre spillet og trykke på -tasten. Du skal se de indtastede tegn. Hvis du trykker på den samtidig med Skift-tasten, skal du være i stand til at indtaste store bogstaver og symboler. Du kan også indtaste japansk, hvis IME er aktiveret. På den anden side, hvis du trykker på en ikke-tegntast, såsom markørtasten, sker der intet.