Utilisation du clavier (version du package du système d’entrée)
Environnement de vérification
- Windows
-
- Fenêtres 11
- Éditeur Unity
-
- 2020.3.25f1
- Package système d’entrée
-
- 1.2.0
Conditions préalables à cette astuce
Les paramètres suivants ont été définis à l’avance comme prémisse pour la description de cette astuce.
Déterminer le moment où une touche spécifique est enfoncée
Lorsque vous appuyez sur une touche, essayez de déplacer l’objet. Placez un objet texte dans le canevas pour confirmer le déplacement. La taille et la position peuvent être appropriées.
La manipulation du clavier est effectuée par scripts. KeyboardOneFrame
Dans ce cas, nous le créons sous la forme .
Le code ressemble à ceci :
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
Vous pouvez obtenir l’état actuel de la pression sur les touches du clavier, etc. à partir de .
keyboard.xxxxxxx.wasPressedThisFrame
Renvoie uniquement true
le moment où la touche est enfoncée.
Dans ce code, dès que vous appuyez sur la touche du curseur, l’opération Déplacer est exécutée sur l’objet transform
Text.
Comme il n’est traité qu’au moment de la pression, le mouvement ne se poursuit pas même si la touche est enfoncée.
Après EventSystem
avoir enregistré le script, attachez-le à l’objet KeyboardOneFrame
et cliquez sur
Définissez l’objet texte à déplacer vers l’objet Text.
Essayez d’exécuter le jeu et de vérifier si la marque @ se déplace lorsque vous appuyez sur la touche du curseur. Assurez-vous également que le fait de maintenir la touche enfoncée ne déplace pas le symbole @.
Quels types de clés peuvent être déterminés?
Il est écrit sur le site officiel, alors s’il vous plaît vérifier ici.
Déterminer le moment où une clé spécifique est libérée
Nous ne créons pas d’échantillon, mais le moment où vous appuyez dessus est déterminé par la propriété, tandis que le moment où wasPressedThisFrame
wasReleasedThisFrame
vous le relâchez peut être jugé par .
Déterminer en appuyant sur une touche spécifique
Ceci est également déterminé par le script. Vous pouvez l’ajouter au code précédent, mais cette fois, nous allons créer un nouveau fichier de script appelé et l’écrire KeyboardPress
.
Le script ressemble à ceci :
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);
}
}
}
Lorsque vous appuyez sur la barre d’espace, l’objet texte est pivoté.
keyboard.xxxxxxxx.isPressed
Renvoie pour toute true
la durée de la clé.
Attachez le script enregistré à l’objet EventSystem
texte et définissez l’objet texte à pivoter.
Assurez-vous que le symbole @ tourne complètement pendant que le jeu est en cours d’exécution et maintenez la barre d’espace.
Obtenir toutes les touches pressées
Essayez d’afficher toutes les touches sur lesquelles vous appuyez sous forme de texte. Vous avez placé un objet texte pour afficher la touche sur laquelle vous appuyez.
KeyboardAllKeys
Créez un script portant le nom .
Le script ressemble à ceci :
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
vous permet d’obtenir des informations sur toutes les clés.
Vous pouvez extraire uniquement celles qui sont vraies de isPressed
ces touches et récupérer uniquement les touches sur lesquelles vous appuyez.
Après cela, la touche sur laquelle vous appuyez est convertie en chaîne et affichée sous forme de texte.
Le EventSystem
script créé s’attache à un objet texte et le définit pour afficher la touche d’appui.
Lancez le jeu et vérifiez que la touche sur laquelle vous appuyez apparaît.
Soit dit en passant, même si vous appuyez sur beaucoup de touches, toutes les touches peuvent ne pas être affichées, mais ne vous inquiétez pas car il s’agit d’un problème physique dû au câblage du clavier.
Obtenir des caractères tapés
Jusqu’à présent, vous aviez le type de touche sur lequel vous appuyiez, mais il est également possible d’obtenir les caractères que vous avez réellement tapés. Par exemple, si la touche « A » est enfoncée, la lettre « a » peut être obtenue, et si la touche « Maj + A » est enfoncée, la lettre « A » peut être obtenue. Si l’éditeur IME est activé, vous pourrez peut-être également récupérer le japonais.
Toutefois, ces caractères saisis ne peuvent pas être récupérés dans les propriétés et seront acquis sous forme d’événements.
Dans l’exemple, un objet texte est placé pour afficher les caractères saisis.
Créez un script. KeyboardTextInput
Le nom est .
Entrez le script comme suit :
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
La onTextInput
classe a un événement appelé , qui est appelé chaque fois que du texte est entré.
OnEnable
Ici, la méthode est enregistrée à la synchronisation de etOnDisable
annulée à OnTextInput
OnTextInput
la synchronisation de .
Keyboard.current
est un objet unique qui existe à partir du moment où le jeu est exécuté jusqu’à ce qu’il soit terminé, alors OnDisable
assurez-vous de le libérer au moment de .
Si vous pouvez toujours jumeler l’inscription et l’annulation d’événements, vous pouvez le définir à tout autre moment.
OnTextInput
Dans la méthode, le caractère entré est défini comme un argument c
, il est donc ajouté en tant que texte.
Après EventSystem
avoir enregistré le script, attachez-le à et définissez un objet texte à afficher.
Essayez d’exécuter le jeu et d’appuyer sur la touche. Vous devriez voir les caractères saisis. Si vous appuyez dessus en même temps que la touche Maj, vous devriez pouvoir entrer des lettres majuscules et des symboles. Vous pouvez également entrer le japonais si l’éditeur IME est activé. D’autre part, si vous appuyez sur une touche sans caractère telle que la touche curseur, rien ne se passera.