Darbas su klaviatūra (įvesties sistemos paketo versija)

Puslapis atnaujintas :
Puslapio sukūrimo data :

Tikrinimo aplinka

Windows
  • Langai 11
"Unity" redaktorius
  • 2020.3.25f1
Įvesties sistemos paketas
  • 1.2.0

Būtinos šio patarimo sąlygos

Šie nustatymai buvo atlikti iš anksto kaip šio patarimo aprašymo prielaida.

Nustatykite momentą, kai paspaudžiamas konkretus klavišas

Kai paspausite klavišą, pabandykite perkelti objektą. Įdėkite teksto objektą į drobę, kad patvirtintumėte perkėlimą. Dydis ir padėtis gali būti tinkami.

Klaviatūros valdymas atliekamas pagal scenarijus. KeyboardOneFrame Šiuo atveju mes jį sukuriame kaip .

Kodas atrodo taip:

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 Galite gauti dabartinį klaviatūros klavišą, paspaudimo būseną ir kt. iš . keyboard.xxxxxxx.wasPressedThisFrame Grąžina tik true klavišo paspaudimo momentą. Šiame kode tuo metu, kai paspaudžiamas žymeklio klavišas, operacija Perkelti atliekama su objektu transform Tekstas . Kadangi jis apdorojamas tik paspaudimo momentu, judėjimas nesiliauja, net jei paspaudžiamas klavišas.

Išsaugoję EventSystem scenarijų, pridėkite prie objekto KeyboardOneFrame ir spustelėkite Nustatykite, kad teksto objektas būtų perkeltas į objektą Tekstas.

Pabandykite paleisti žaidimą ir patikrinti, ar @ ženklas juda, kai paspaudžiate žymeklio klavišą. Be to, įsitikinkite, kad laikant nuspaustą klavišą nepajudinamas simbolis @.

Kokių tipų raktus galima nustatyti?

Jis parašytas oficialioje svetainėje, todėl patikrinkite ten.

Nustatykite momentą, kai išleidžiamas konkretus raktas

Mes nekuriame pavyzdžio, tačiau jo paspaudimo momentą lemia savybė, o jo išleidimo momentas wasPressedThisFrame wasReleasedThisFrame gali būti vertinamas pagal .

Nustatykite paspausdami konkretų klavišą

Tai lemia ir scenarijus. Galite pridėti jį prie ankstesnio kodo, bet šį kartą sukursime naują scenarijaus failą pavadinimu ir parašysime KeyboardPress jį .

Scenarijus atrodo taip:

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

Paspaudus tarpo klavišą, teksto objektas pasukamas. keyboard.xxxxxxxx.isPressed Grąžina visą true rakto trukmę.

Pridėkite įrašytą EventSystem scenarijų prie teksto objekto ir nustatykite, kad teksto objektas būtų pasuktas.

Įsitikinkite, kad simbolis @ sukasi iki galo, kol žaidimas veikia ir laiko tarpo klavišą.

Gaukite visus paspaustus klavišus

Pabandykite rodyti visus klavišus, kuriuos spaudžiate, kaip tekstą. Įdėjote teksto objektą, kad būtų rodomas paspaudžiamas klavišas.

KeyboardAllKeys Sukurkite scenarijų su pavadinimu .

Scenarijus atrodo taip:

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 leidžia gauti informaciją apie visus raktus. Iš isPressed tų klavišų galite išgauti tik tuos, kurie yra teisingi, ir gauti tik tuos klavišus, kuriuos spaudžiate. Po to paspaudžiamas klavišas konvertuojamas į eilutę ir rodomas kaip tekstas.

Sukurtas EventSystem scenarijus prideda ir nustato teksto objektą paspaudimo klavišui rodyti.

Paleiskite žaidimą ir patikrinkite, ar pasirodo paspaudžiamas klavišas.

Beje, net jei paspausite daug klavišų, visi klavišai gali būti nerodomi, tačiau nesijaudinkite dėl to, nes tai yra fizinė problema dėl klaviatūros laidų.

Įvestų simbolių gavimas

Iki šiol gavote paspausto klavišo tipą, tačiau taip pat galima gauti simbolius, kuriuos iš tikrųjų įvedėte. Pavyzdžiui, jei paspaudžiamas "A" klavišas, galima gauti raidę "a", o paspaudus "Shift + A" klavišą, galima gauti raidę "A". Jei IME įjungta, galbūt galėsite nuskaityti japonų kalbą.

Tačiau šių įvestų simbolių negalima gauti ypatybėse ir jie bus įgyti įvykių pavidalu.

Pavyzdyje teksto objektas dedamas į įvestų simbolių rodymą.

Sukurkite scenarijų. KeyboardTextInput Pavadinimas yra .

Įveskite scenarijų taip:

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

KeyboardKlasė onTextInput turi įvykį, vadinamą , kuris vadinamas kiekvieną kartą, kai įvedamas tekstas. OnEnable Čia metodas registruojamas laiku irOnDisable atšaukiamas OnTextInput OnTextInput . Keyboard.current yra unikalus objektas, egzistuojantis nuo žaidimo vykdymo iki jo nutraukimo, todėl OnDisable būtinai išleiskite jį tuo metu, kai . Jei visada galite susieti įvykių registraciją ir atšaukimą, galite tai nustatyti bet kuriuo kitu metu.

OnTextInput Metode įvestas simbolis nustatomas kaip argumentas c , todėl jis pridedamas kaip tekstas.

Išsaugoję EventSystem scenarijų, pridėkite jį prie teksto objekto ir nustatykite rodyti tekstą.

Pabandykite paleisti žaidimą ir paspausti klavišą. Turėtumėte pamatyti įvestus simbolius. Jei paspausite jį tuo pačiu metu kaip ir klavišą "Shift", turėtumėte turėti galimybę įvesti didžiąsias raides ir simbolius. Taip pat galite įvesti japonų kalbą, jei IME įjungta. Kita vertus, jei paspausite ne simbolio klavišą, pvz., žymeklio klavišą, nieko neįvyks.