Klavye ile Çalışma (Giriş Sistemi Paket Sürümü)

Sayfa güncel :
Sayfa oluşturma tarihi :

Doğrulama ortamı

Windows
  • Pencereler 11
Birlik Editörü
  • 2020.3.25f1
Giriş Sistemi Paketi
  • 1.2.0

Bu ipucu için önkoşullar

Aşağıdaki ayarlar, bu ipucunun açıklaması için bir öncül olarak önceden yapılmıştır.

Belirli bir tuşa basıldığı anı belirleme

Bir tuşa bastığınızda, nesneyi taşımayı deneyin. Hareketi onaylamak için Kanvas'a bir metin nesnesi yerleştirin. Boyut ve konum uygun olabilir.

Klavye kullanımı komut dosyaları tarafından yapılır. KeyboardOneFrame Bu durumda, onu şu şekilde oluştururuz: .

Kod şöyle görünür:

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 Geçerli klavye tuşuna basma durumunu vb. şuradan alabilirsiniz: . keyboard.xxxxxxx.wasPressedThisFrame yalnızca true tuşa basıldığı anın zamanlamasını döndürür. Bu kodda, imleç tuşuna basıldığı anda, Text nesnesi transform üzerinde Move işlemi gerçekleştirilir. Sadece basma anında işlendiği için tuşa basılsa bile hareket devam etmez.

Komut dosyasını kaydettikten sonra EventSystem , nesneye KeyboardOneFrame ekleyin ve Text nesnesine taşınacak metin nesnesini ayarlayın.

Oyunu çalıştırmayı ve imleç tuşuna bastığınızda @ işaretinin hareket edip etmediğini kontrol etmeyi deneyin. Ayrıca, tuşu basılı tutmanın @ sembolünü hareket ettirmediğinden emin olun.

Ne tür anahtarlar belirlenebilir?

Resmi web sitesinde yazılmıştır, bu yüzden lütfen orada kontrol edin.

Belirli bir anahtarın serbest bırakıldığı anı belirleme

Bir örnek oluşturmuyoruz, ancak bastığınız an özellik tarafından belirlenirken, serbest bıraktığınız an wasPressedThisFrame wasReleasedThisFrame .

Belirli bir tuşa basarken belirleme

Bu aynı zamanda komut dosyası tarafından da belirlenir. Önceki koda ekleyebilirsiniz, ancak bu sefer adlı yeni bir komut dosyası oluşturacağız ve yazacağız KeyboardPress .

Komut dosyası şöyle görünür:

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

Boşluk çubuğuna basıldığında, metin nesnesi döndürülür. keyboard.xxxxxxxx.isPressed anahtarın tüm true süresi boyunca geri döner.

Kaydedilen komut dosyasını Metin Nesnesi'ne EventSystem ekleyin ve döndürülecek metin nesnesini ayarlayın.

Oyun çalışırken ve boşluk çubuğunu basılı tutarken @ sembolünün sonuna kadar döndüğünden emin olun.

Basılan tüm tuşları alın

Bastığınız tüm tuşları metin olarak görüntülemeyi deneyin. Bastığınız tuşu görüntülemek için bir metin nesnesi yerleştirdiniz.

KeyboardAllKeys Adıyla bir komut dosyası oluşturun.

Komut dosyası şöyle görünür:

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 tüm anahtarlar hakkında bilgi almanızı sağlar. Bu tuşlardan isPressed yalnızca doğru olanları ayıklayabilir ve yalnızca bastığınız tuşları alabilirsiniz. Bundan sonra, bastığınız tuş bir dizeye dönüştürülür ve metin olarak görüntülenir.

Oluşturulan EventSystem komut dosyası, basma tuşunu görüntülemek için bir metin nesnesine eklenir ve ayarlanır.

Oyunu çalıştırın ve bastığınız tuşun göründüğünü doğrulayın.

Bu arada, çok sayıda tuşa bassanız bile, tüm tuşlar görüntülenmeyebilir, ancak endişelenmeyin çünkü klavye kablolaması nedeniyle fiziksel bir sorundur.

Yazılan karakterleri alma

Şimdiye kadar, bastığınız tuş türüne sahipsiniz, ancak gerçekten yazdığınız karakterleri almak da mümkün. Örneğin "A" tuşuna basılırsa "a" harfi, "Shift+A" tuşuna basılırsa "A" harfi elde edilebilir. IME etkinse, Japonca'yı da alabilirsiniz.

Ancak, girilen bu karakterler özelliklerde alınamaz ve olaylar biçiminde edinilir.

Örnekte, girilen karakterleri görüntülemek için bir metin nesnesi yerleştirilir.

Bir komut dosyası oluşturun. KeyboardTextInput Adı .

Komut dosyasını aşağıdaki gibi girin:

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

KeyboardSınıfınonTextInput, metin girildiğinde çağrılan adlı bir olayı vardır. OnEnable Burada, yöntem zamanlamasında kaydedilir veOnDisable zamanlamasında iptal edilir OnTextInput OnTextInput. Keyboard.current, oyunun yürütüldüğü andan sonlandırılana kadar var olan benzersiz bir nesnedir, bu nedenle OnDisable . Etkinlik kaydı ve iptalini her zaman eşleştirebiliyorsanız, başka bir zamanda ayarlayabilirsiniz.

OnTextInput Yöntemde, girilen karakter bağımsız değişken c olarak ayarlanır, bu nedenle metin olarak eklenir.

Komut dosyasını kaydettikten sonra EventSystem , görüntülemek üzere bir metin nesnesine ekleyin ve ayarlayın.

Oyunu çalıştırmayı ve tuşa basmayı deneyin. Girilen karakterleri görmeniz gerekir. Shift tuşuyla aynı anda basarsanız, büyük harfler ve semboller girebilmeniz gerekir. IME etkinse Japonca da girebilirsiniz. Öte yandan, imleç tuşu gibi karakter olmayan bir tuşa basarsanız, hiçbir şey olmaz.