Működtetés a billentyűzettel (beviteli rendszercsomag verziója)
Ellenőrzési környezet
- Windows
-
- Windows 11 esetén
- Unity-szerkesztő
-
- 2020.3.25f1
- Bemeneti rendszercsomag
-
- 1.2.0
A tipp előfeltételei
A következő beállításokat előre elvégeztük a tipp leírásának előfeltételeként.
Egy adott billentyű lenyomásának pillanatának meghatározása
Amikor megnyom egy billentyűt, próbálja meg áthelyezni az objektumot. Helyezzen el egy szöveges objektumot a vásznon az áthelyezés megerősítéséhez. A méret és a pozíció megfelelő lehet.
A billentyűzet kezelése szkriptekkel történik. KeyboardOneFrame
Ebben az esetben .
A kód így néz ki:
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
A billentyűzet aktuális lenyomási állapotát stb. innen kaphatja meg.
keyboard.xxxxxxx.wasPressedThisFrame
Csak true
a billentyű lenyomásának időpontját adja vissza.
Ebben a kódban a kurzorbillentyű megnyomásának pillanatában a Move művelet a Text objektumon transform
kerül végrehajtásra .
Mivel csak a megnyomás pillanatában kerül feldolgozásra, a mozgás akkor sem folytatódik, ha a gombot megnyomják.
A parancsfájl mentése után EventSystem
csatolja az objektumhoz KeyboardOneFrame
, majd kattintson a
Állítsa be a szövegobjektumot a Szöveg objektumba való áthelyezésre.
Próbálja meg futtatni a játékot, és ellenőrizze, hogy a kurzorbillentyű megnyomásakor mozog-e a @ jel. Győződjön meg arról is, hogy a billentyű lenyomva tartása nem mozgatja a @ szimbólumot.
Milyen típusú kulcsok határozhatók meg?
A hivatalos weboldalon van írva, ezért kérjük, ellenőrizze ott.
Egy adott kulcs felszabadításának pillanatának meghatározása
Nem készítünk mintát, de a megnyomás pillanatát az ingatlan határozza meg, míg a kiadás pillanatát wasPressedThisFrame
wasReleasedThisFrame
az alapján lehet megítélni.
Meghatározás egy adott billentyű lenyomásakor
Ezt a forgatókönyv is meghatározza. Hozzáadhatja az előző kódhoz, de ezúttal létrehozunk egy új szkriptfájlt és írjuk .KeyboardPress
A szkript így néz ki:
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);
}
}
}
A szóköz billentyű lenyomása közben a szövegobjektum elfordul.
keyboard.xxxxxxxx.isPressed
A kulcs teljes true
időtartamára visszatér.
Csatolja a mentett parancsfájlt a Szöveges objektumhoz, és állítsa be a EventSystem
szövegobjektumot elforgatásra.
Győződjön meg arról, hogy a @ szimbólum teljesen elfordul, miközben a játék fut, és lenyomva tartja a szóköz billentyűt.
Az összes lenyomott gomb beszerzése
Próbálja meg szövegként megjeleníteni az összes lenyomott billentyűt. Szöveges objektumot helyezett el a lenyomott billentyű megjelenítéséhez.
KeyboardAllKeys
Hozzon létre egy szkriptet . névvel
A szkript így néz ki:
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
Lehetővé teszi, hogy információt kapjon az összes kulcsról.
Csak azokat nyerheti ki ezekből a billentyűkből isPressed
, amelyek igazak, és csak a lenyomott billentyűket kérheti le.
Ezután a megnyomott gomb karakterláncgá alakul, és szövegként jelenik meg.
A EventSystem
létrehozott szkript csatol és beállít egy szöveges objektumot a nyomógomb megjelenítéséhez.
Futtassa a játékot, és ellenőrizze, hogy megjelenik-e a megnyomott billentyű.
Egyébként, még akkor is, ha sok billentyűt nyom meg, előfordulhat, hogy az összes gomb nem jelenik meg, de ne aggódjon emiatt, mert fizikai probléma a billentyűzet vezetékei miatt.
Beírt karakterek beolvasása
Mostanáig megkapta a lenyomott billentyű típusát, de lehetőség van a ténylegesen beírt karakterek megszerzésére is. Például, ha megnyomja az "A" billentyűt, az "a" betű elérhető, és ha megnyomja a "Shift + A" billentyűt, az "A" betű kapható. Ha az írásjegybevivő engedélyezve van, előfordulhat, hogy a japán nyelvet is le tudja kérni.
Ezek a beírt karakterek azonban nem kérhetők be a tulajdonságokban, és események formájában lesznek beolvasva.
A mintában egy szöveges objektum kerül elhelyezésre a beírt karakterek megjelenítéséhez.
Hozzon létre egy szkriptet. KeyboardTextInput
A név .
Adja meg a szkriptet az alábbiak szerint:
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
Az onTextInput
osztálynak van egy nevű eseménye, amelyet a rendszer minden szövegbevitelkor meghív.
OnEnable
Itt a módszert az időzítésében regisztrálják, ésOnDisable
az időzítéskor OnTextInput
OnTextInput
törlik.
Keyboard.current
egy egyedi objektum, amely a játék végrehajtásától annak befejezéséig létezik, ezért OnDisable
ügyeljen arra, hogy a .
Ha mindig párosíthatja az esemény regisztrációját és lemondását, bármikor beállíthatja máskor.
OnTextInput
A metódusban a beírt karakter argumentumként c
van beállítva , így szövegként lesz hozzáfűzve.
A szkript mentése után EventSystem
csatolja és állítson be egy szöveges objektumot megjelenítésre.
Próbálja meg futtatni a játékot, és nyomja meg a gombot. Látnia kell a beírt karaktereket. Ha a Shift billentyűvel egyidejűleg nyomja meg, akkor nagybetűket és szimbólumokat kell beírnia. Japán nyelvet is megadhat, ha az írásjegybevivő engedélyezve van. Másrészt, ha megnyom egy nem karakteres billentyűt, például a kurzorbillentyűt, semmi sem történik.