Obsługa za pomocą klawiatury (wersja pakietu systemu wprowadzania)
Środowisko weryfikacji
- Windows
-
- Okna 11
- Edytor Unity
-
- 2020.3.25f1
- Pakiet systemu wejściowego
-
- 1.2.0
Wymagania wstępne dotyczące tej porady
Poniższe ustawienia zostały wcześniej wprowadzone jako przesłanka do opisu tej wskazówki.
Określanie momentu naciśnięcia określonego
Po naciśnięciu spróbuj przesunąć obiekt. Umieść obiekt tekstowy w obszarze roboczym, aby potwierdzić przeniesienie. Rozmiar i pozycja mogą być odpowiednie.
Obsługa klawiatury odbywa się za pomocą skryptów. KeyboardOneFrame
W tym przypadku tworzymy go jako .
Kod wygląda następująco:
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
Możesz uzyskać bieżący stan naciśnięcia klawiatury itp. z .
keyboard.xxxxxxx.wasPressedThisFrame
Zwraca tylko true
czas momentu naciśnięcia.
W tym kodzie w momencie naciśnięcia kursora operacja Move jest wykonywana na obiekcie transform
Text .
Ponieważ jest przetwarzany tylko w momencie naciśnięcia, ruch nie jest kontynuowany, nawet jeśli zostanie naciśnięty.
Po EventSystem
zapisaniu skryptu dołącz do obiektu KeyboardOneFrame
i kliknij
Ustaw obiekt tekstowy, który ma zostać przeniesiony do obiektu Tekst.
Spróbuj uruchomić grę i sprawdzić, czy znak @ porusza się po naciśnięciu kursora. Upewnij się również, że przytrzymanie nie spowoduje przesunięcia symbolu @.
Jakie typy kluczy można określić?
Jest to napisane na oficjalnej stronie internetowej, więc sprawdź tam.
Określanie momentu zwolnienia określonego klucza
Nie tworzymy próbki, ale moment jej naciśnięcia zależy od właściwości, natomiast moment wasPressedThisFrame
wasReleasedThisFrame
jej zwolnienia może być oceniany przez .
Określanie podczas naciskania określonego
Jest to również określone przez skrypt. Możesz dodać go do poprzedniego kodu, ale tym razem utworzymy nowy plik skryptu o nazwie i zapiszemy go KeyboardPress
.
Skrypt wygląda tak:
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);
}
}
}
Po naciśnięciu spacji obiekt tekstowy jest obracany.
keyboard.xxxxxxxx.isPressed
Zwraca cały true
czas trwania klucza.
Dołącz zapisany EventSystem
skrypt do obiektu tekstowego i ustaw obiekt tekstowy do obrócenia.
Upewnij się, że symbol @ obraca się do końca, gdy gra jest uruchomiona i przytrzymuje spację.
Pobierz wszystkie naciśnięte
Spróbuj wyświetlić wszystkie naciskane jako tekst. Umieściłeś obiekt tekstowy, aby wyświetlić naciśnięty.
KeyboardAllKeys
Utwórz skrypt o nazwie .
Skrypt wygląda tak:
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
pozwala uzyskać informacje o wszystkich kluczach.
Z isPressed
tych można wyodrębnić tylko te, które są prawdziwe, i pobrać tylko, które naciskasz.
Następnie naciśnięty jest konwertowany na ciąg znaków i wyświetlany jako tekst.
Utworzony EventSystem
skrypt dołącza i ustawia obiekt tekstowy do wyświetlania naciskania.
Uruchom grę i sprawdź, czy naciśnięty jest widoczny.
Nawiasem mówiąc, nawet jeśli naciśniesz wiele, wszystkie mogą nie być wyświetlane, ale nie martw się o to, ponieważ jest to problem fizyczny z powodu okablowania klawiatury.
Wpisywanie znaków
Do tej pory miałeś typ, który nacisnąłeś, ale możliwe jest również uzyskanie znaków, które faktycznie wpisałeś. Na przykład, jeśli naciśnięty zostanie "A", można uzyskać literę "a", a jeśli naciśnięty zostanie "Shift + A", można uzyskać literę "A". Jeśli edytor IME jest włączony, można również pobrać język japoński.
Jednak tych wprowadzonych postaci nie można odzyskać we właściwościach i zostaną one nabyte w formie zdarzeń.
W przykładzie umieszczany jest obiekt tekstowy w celu wyświetlenia wprowadzonych znaków.
Utwórz skrypt. KeyboardTextInput
Nazwa to .
Wprowadź skrypt w następujący sposób:
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
Klasa onTextInput
ma zdarzenie o nazwie , które jest wywoływane przy każdym wprowadzeniu tekstu.
OnEnable
Tutaj metoda jest rejestrowana w czasie iOnDisable
anulowana w OnTextInput
OnTextInput
czasie .
Keyboard.current
jest unikalnym obiektem, który istnieje od momentu wykonania gry do momentu jej zakończenia, więc OnDisable
pamiętaj, aby zwolnić go w czasie .
Jeśli zawsze możesz sparować rejestrację i anulowanie wydarzenia, możesz ustawić to w dowolnym innym momencie.
OnTextInput
W metodzie wprowadzony znak jest ustawiany jako argument c
, więc jest dołączany jako tekst.
Po EventSystem
zapisaniu skryptu dołącz go do obiektu tekstowego i ustaw obiekt tekstowy do wyświetlenia.
Spróbuj uruchomić grę i nacisnąć. Powinny zostać wyświetlone wprowadzone znaki. Jeśli naciśniesz go w tym samym czasie, co Shift, powinieneś być w stanie wprowadzić wielkie litery i symbole. Możesz także wprowadzić język japoński, jeśli edytor IME jest włączony. Z drugiej strony, jeśli naciśniesz bez znaku, taki jak kursora, nic się nie stanie.