Klavye ile Çalışma (Giriş Sistemi Paket Sürümü)
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;
}
}
Keyboard
Sı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.