Upravljanje s tipkovnico (različica paketa vhodnega sistema)

Stran posodobljena :
Datum ustvarjanja strani :

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

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