【Unity】【C#】InputSystem.Key をリアルタイムで調べる / Windows 日本語キーボードでの Key 一覧 
2020/10/06 Tue [edit]
InputSystem も Verified (正式版) となり、(旧)InputManager との混在も可能でもあるが、いずれ InputSystem の方法を中心として使いたいので調査中。
これは以前に KeyCode でリアルタイムで調べるコードを InputSystem.Key に書き直したものだ。
ただ、システムの仕様なのかバグなのか、エラーが出たり挙動がおかしくなったりする場合があるのを確認している。参考程度で試して欲しい。
・KeyCode をリアルタイムで調べる / Windows 日本語キーボードでの記号の KeyCode 一覧
(※) Unity 2019.4.11f1 / InputSystem 1.0.0 / Windows10(x64) で確認
■InputSystem.Key をリアルタイムで調べるコード
●InputSystem.Key をリアルタイムで調べる
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
#if ENABLE_INPUT_SYSTEM
using UnityEngine.InputSystem;
#endif
public class InputSystemRelatimeKeyCheck : MonoBehaviour
{
#if ENABLE_INPUT_SYSTEM
Key[] inputSystemKeys;
//Keyboard.current[key] で以下はエラーが出るため、除外するリスト
//ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
HashSet<Key> exceptKeys = new HashSet<Key>()
{
Key.None, Key.IMESelected,
};
private void Start()
{
inputSystemKeys = Enum.GetValues(typeof(Key))
.Cast<Key>()
.Where(e => !exceptKeys.Contains(e)) //exceptKeys にあるものは除く
.ToArray();
}
private void Update()
{
if (Keyboard.current.anyKey.wasPressedThisFrame) //Input.anyKeyDown 相当
{
foreach (var key in inputSystemKeys)
{
if (Keyboard.current[key].wasPressedThisFrame)
{
Debug.Log(key);
break;
}
}
}
}
#endif
}
コメントにも書いてあるが、Keyboard.current[key] では Key.None, Key.IMESelected を入れるとエラーを吐くようだ。もしかしたら、まだ他にもエラーになるものがあるかもと思い、HashSet で定義してあるが、今の所2つしかないようなので(掲載時点:1.0.0)、以下のように Where に直接書くのも良いだろう。
Key[] inputSystemKeys = Enum.GetValues(typeof(Key)).Cast<Key>().Where(e => e != Key.None && e != Key.IMESelected).ToArray();
あと、日本語変換キーや CapsLock キーを使うと(単体で CapsLock を押すとおかしくなる)、Keyboard.current.anyKey が利かなくなることがあるのも確認している(※キーボードによるかも? ← Unity公式にバグレポートとして出したが、「問題を確認できず」と返信が来た。もしかしたら、使っているキーボードによるのかも知れない:Windows日本語106キーボードとか、Shiftを押してCapsLockをするタイプのみとか、メーカーとか、ハードウェア依存がある?[掲載時点:1.0.0])。
■Windows 日本語キーボードでの InputSystem.Key 一覧
基本的には英語配列キーボードと照らし合わせて考えた方が良いだろう。特に記号や機能キーの配置は日本語配列キーボードでは違うので、使うなら注意した方が良いだろう。
(参考)
・キーボード。日本語配列と英語配列。
・101/104/109…キーボード配列、種類、構造についての解説と一覧
・キー配列
マニュアルにも書いてあるが、キーは物理的な配置に依存しているらしいので、日本語配列と英語配列のキーボードでの違いに注意して欲しい。まぁ、Unity は海外製なので、基本的には英語配列キーボードを見て確かめた方が良いだろう。私が調べてみた結果は後述の一覧にまとめた。
(マニュアル日本語訳)
ちなみに、Key (enum型) と displayName (文字列型) はコードでは以下のように使える。
//Key(enum)型表記
Keyboard.current[Key.A].wasPressedThisFrame
//displayName (文字列型) → control path にして利用(※大文字小文字は区別しない)
((KeyControl)Keyboard.current["#(a)"]).wasPressedThisFrame //※要: KeyControl にキャスト
//displayName (文字列型) を KeyboardLayout から検出
var keyControl = Keyboard.current.FindKeyOnCurrentKeyboardLayout("a");
keyControl.wasPressedThisFrame //押した瞬間
(マニュアル)Control paths
また、以下に displayName から簡単に Key (enum) を取得するメソッドも定義してみたので、コピペしておくと便利かも。
・displayName や control path から Key (キーコード) を取得する
●Windows 日本語キーボードでの記号の InputSystem.Key 一覧
InputSystem.Key (int) | (日本語)キーボード | displayName | 備考 |
---|---|---|---|
None (0) | (なし/未定義値) | (なし) | Keyboard.current[Key.None] とするとエラーになる |
Space (1) | Space | Space | |
Enter (2) | Enter | Enter | |
Tab (3) | Tab | Tab | |
Backquote (4) | 半角/全角 漢字 | 半角/全角 | |
Quote (5) | :* | : | |
Semicolon (6) | ;+ | ; | |
Comma (7) | ,< | , | |
Period (8) | .> | . | |
Slash (9) | /? | / | |
Backslash (10) | ]} | ] | |
LeftBracket (11) | @` | @ | |
RightBracket (12) | [{ | [ | |
Minus (13) | -= | - | |
Equals (14) | ^~ | ^ | |
A (15) | A | A | |
B (16) | B | B | |
C (17) | C | C | |
D (18) | D | D | |
E (19) | E | E | |
F (20) | F | F | |
G (21) | G | G | |
H (22) | H | H | |
I (23) | I | I | |
J (24) | J | J | |
K (25) | K | K | |
L (26) | L | L | |
M (27) | M | M | |
N (28) | N | N | |
O (29) | O | O | |
P (30) | P | P | |
Q (31) | Q | Q | |
R (32) | R | R | |
S (33) | S | S | |
T (34) | T | T | |
U (35) | U | U | |
V (36) | V | V | |
W (37) | W | W | |
X (38) | X | X | |
Y (39) | Y | Y | |
Z (40) | Z | Z | |
Digit1 (41) | フルキー 1 | 1 | |
Digit2 (42) | フルキー 2 | 2 | |
Digit3 (43) | フルキー 3 | 3 | |
Digit4 (44) | フルキー 4 | 4 | |
Digit5 (45) | フルキー 5 | 5 | |
Digit6 (46) | フルキー 6 | 6 | |
Digit7 (47) | フルキー 7 | 7 | |
Digit8 (48) | フルキー 8 | 8 | |
Digit9 (49) | フルキー 9 | 9 | |
Digit0 (50) | フルキー 0 | 0 | |
LeftShift (51) | 左 Shift | Shift | |
RightShift (52) | 右 Shift | Right Shift | |
LeftAlt (53) | 左 Alt | Alt | |
RightAlt (54) | 右 Alt | Right Alt | |
AltGr (54) | 右 Alt | Right Alt | RightAlt (54) と値重複(別名) |
LeftCtrl (55) | 左 Ctrl | Ctrl | |
RightCtrl (56) | 右 Ctrl | Right Control | |
LeftMeta (57) | Windowsキー | Left Windows | |
LeftWindows (57) | Windowsキー | Left Windows | LeftMeta (57) と値重複(別名) |
LeftCommand (57) | Windowsキー | Left Windows | LeftMeta (57) と値重複(別名) |
LeftApple (57) | Windowsキー | Left Windows | LeftMeta (57) と値重複(別名) |
RightCommand (58) | 右 Windowsキー(※未確認) | Right Windows | 英語キーボードでの場合。日本語キーボードの変換キー等は反応しない |
RightMeta (58) | 右 Windowsキー(※未確認) | Right Windows | RightCommand (58) と値重複(別名) |
RightWindows (58) | 右 Windowsキー(※未確認) | Right Windows | RightCommand (58) と値重複(別名) |
RightApple (58) | 右 Windowsキー(※未確認) | Right Windows | RightCommand (58) と値重複(別名) |
ContextMenu (59) | メニューキー | Application | |
Escape (60) | Esc | Esc | |
LeftArrow (61) | ← | Left | |
RightArrow (62) | → | Right | |
UpArrow (63) | ↑ | Up | |
DownArrow (64) | ↓ | Down | |
Backspace (65) | Backspace | Backspace | |
PageDown (66) | PgDn | Page Down | |
PageUp (67) | PgUp | Page Up | |
Home (68) | Home | Home | |
End (69) | End | End | |
Insert (70) | Insert | Insert | |
Delete (71) | Delete | Delete | |
CapsLock (72) | CapsLock | Caps Lock | CapsLockを使うとおかしくなることがある(※キーボードによるかも?) [※InputSystem 1.0.0 時点] |
NumLock (73) | NumLock | Pause | |
PrintScreen (74) | Print Screen | ||
ScrollLock (75) | ScrollLock | Scroll Lock | |
Pause (76) | Pause | Break | |
NumpadEnter (77) | テンキー Enter | Num Enter | |
NumpadDivide (78) | テンキー / | Num / | |
NumpadMultiply (79) | テンキー * | Num * | |
NumpadPlus (80) | テンキー + | Num + | |
NumpadMinus (81) | テンキー - | Num - | |
NumpadPeriod (82) | テンキー . | Num Del | |
NumpadEquals (83) | (未確認) | Numpad = | |
Numpad0 (84) | テンキー 0 | Num 0 | |
Numpad1 (85) | テンキー 1 | Num 1 | |
Numpad2 (86) | テンキー 2 | Num 2 | |
Numpad3 (87) | テンキー 3 | Num 3 | |
Numpad4 (88) | テンキー 4 | Num 4 | |
Numpad5 (89) | テンキー 5 | Num 5 | |
Numpad6 (90) | テンキー 6 | Num 6 | |
Numpad7 (91) | テンキー 7 | Num 7 | |
Numpad8 (92) | テンキー 8 | Num 8 | |
Numpad9 (93) | テンキー 9 | Num 9 | |
F1 (94) | F1 | F1 | |
F2 (95) | F2 | F2 | |
F3 (96) | F3 | F3 | |
F4 (97) | F4 | F4 | |
F5 (98) | F5 | F5 | |
F6 (99) | F6 | F6 | |
F7 (100) | F7 | F7 | |
F8 (101) | F8 | F8 | |
F9 (102) | F9 | F9 | |
F10 (103) | F10 | F10 | |
F11 (104) | F11 | F11 | |
F12 (105) | F12 | F12 | |
OEM1 (106) | (不明) | OEM1 | ※OEM~ キーは追加キーらしい |
OEM2 (107) | \_ | \ | [\| ]キーは反応しない?(英語キーボードにはない) displayName で使うときは、((KeyControl)Keyboard.current["#(\\\\)"]).wasPressedThisFrame |
OEM3 (108) | (不明) | OEM3 | ※OEM~ キーは追加キーらしい |
OEM4 (109) | (不明) | OEM4 | ※OEM~ キーは追加キーらしい |
OEM5 (110) | (不明) | OEM5 | ※OEM~ キーは追加キーらしい |
IMESelected (111) | (なし) | (なし) | Keyboard.current[Key.IMESelected] とするとエラーになる |
マニュアルを見てると、「No corresponding API yet.」(まだ対応するものがない)というのがいくつもあるので、全て新旧一致できるわけではないようだが、よく使われる機能なら完全互換でいけそうなものも多いね。
ただ、今まで使っていた (旧)InputManager のコード(※主に Input) は全て書き換えないとならないので、大変な労力がいるのが難点。なので、しばらくは一部機能だけ使う感じになるだろう。
いずれ、スワイプ, ピンチ, 長押しなどのライブラリも InputSystem に対応しようと思っているが、ラッパー関数でも作らないと、旧新互換で作るのは骨が折れるね(笑)。
(関連記事)
【Unity】【C#】KeyCode をリアルタイムで調べる / Windows 日本語キーボードでの記号の KeyCode 一覧
【Unity】【C#】(旧)KeyCode と InputSystem.Key の対応
【Unity】【C#】InputSystem の displayName や control path から Key (キーコード) を取得する
【Unity】【C#】InputSystem の Keyboard クラスと (旧)Input.GetKey の対応
【Unity】【C#】InputSystem で Android のバックキーの isPressed がなぜか一定時間で false になる?
【Unity】【C#】InputSystem の Mouse クラスと(旧)Input.GetMouseButton の対応
【Unity】【C#】InputSystem でマウスのホイール(scroll)取得と (旧)Input との対応
【Unity】【C#】InputSystem.TouchPhase の IsActive(), IsEndedOrCanceled() [拡張メソッド] の具体値
【Unity】5ボタンマウスの KeyCode 図解
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/368-2d51021d
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |