【Unity】【C#】(旧)KeyCode と InputSystem.Key の対応 
2020/10/07 Wed [edit]
InputSystem も Verified (正式版) となり、(旧)InputManager との混在も可能でもあるが、いずれ InputSystem の方法を中心として使いたいので調査中。
前回は InputSystem.Key と実際の(日本語)キーボードとの対応を調べたので、今回は (旧)InputManager の KeyCode との対応を調べてみた。
やり方は簡単で、以下の2つを同時にやれば良いだけだ。あくまで日本語キーボードでの調査であることに注意して欲しい。
・InputSystem.Key をリアルタイムで調べる / Windows 日本語キーボードでの Key 一覧
・KeyCode をリアルタイムで調べる / Windows 日本語キーボードでの記号の KeyCode 一覧
Unity 自体は海外製なので、実際には英語配列のキーボードで作られていると考えた方が良い。ここではその違いを一覧で見ておこうというわけだ。特に記号や機能キーの配置はキーボードによって違うので(104, 105, 106 キーボードとあるように)、ものによってはボタン自体がないという場合もある。使う時は確認してから実装しよう。
(※) Unity 2019.4.11f1 / InputSystem 1.0.0 / Windows10(x64) で確認
■(旧)KeyCode と InputSystem.Key の対応
マニュアルにも書いてあるが、キーは物理的な配置に依存しているらしいので、日本語配列と英語配列のキーボードでの違いに注意して欲しい。まぁ、Unity は海外製なので、基本的には英語配列キーボードを見て確かめた方が良いだろう。
(マニュアル日本語訳)
(参考
・キーボード。日本語配列と英語配列。
・101/104/109…キーボード配列、種類、構造についての解説と一覧
・キー配列
先に簡単なデータを述べておくと、現在のバージョン(掲載時点:Unity2019.4.11f1)では、KeyCode の名前の数は 全 326 個、InputSystem.Key の名前の数は 全 119 個である。
ここで「名前」と言っているのは、enum 型は int値での重複はできるので、値の方で数を調べてしまうと総数より少なくなってしまう可能性があるからである。また、enum の整数値は全く一致してない。
ただ、KeyCode の場合は、キーボードだけでなく、マウスやジョイスティックにも拡張されているので、今回の InputSystem.Key との照合の場合は余計なものも多い(InputSystem は Keyboard, Mouse, Touch に分かれている。ただし、Control paths のように文字列で指定することもできる)。
なので、その余計なもの(大まかには KeyCode.Mouse0 / .JoystickButton0 以降全て)を取り除くと、139 個となり、単純な名前一致は 79 個、不一致は 60 個となる。
そしてその不一致を眺めてみると、2つのパターンがある。
1. フルキー/テンキーを表す先頭文字列が変更されているもの (27 個)
・"Alpha0"(KeyCode) → "Digit0"(Key)
・"Keypad0"(KeyCode) → "Numpad0"(Key)
2. 単純に名前が変更されているもの (5 個)
・"Return"(KeyCode) → "Enter"(Key)
・"PrintScreen"(KeyCode) → "Print"(Key)
・"Menu"(KeyCode) → "ContextMenu"(Key)
・"LeftControl"(KeyCode) → "LeftCtrl"(Key)
・"RightControl"(KeyCode) → "RightCtrl"(Key)
これらを差し引くと、一致+一定パターン 111 個、不一致 28 個(計 139 個 [※Mouse0 以降は除外した数])となる。
また、Alt や Command キーは整数値が違ったり同じだったりするので、少しやっかいでもある。
ちなみに、"(なし)" となっているもののほとんどは、InputSystem.Key が物理的な配置キーに対し、KeyCode は文字ごとに値があるためだろう。
ただ、注意点として "Backslash" はどちらもあるのだが、InputSystem は物理配置に依存しているためか、日本語キーボードだと Key.Backslash (enum) では反応しないみたいだ。その代わり Key.OEM2 で反応した。この OEM~ はどうやら標準を 104 キーボードとし、105, 106,… のとき追加キーらしい。
しかし、ボタンの配置が変わってしまうと良くないので、他のやり方として、displayName を試してみたら、以下の表記で使えた。
//Backslash を displayName で使う
((KeyControl)Keyboard.current["#(\\\\)"]).wasPressedThisFrame //※要キャスト
//KeyboardLayout を利用
var keyControl = Keyboard.current.FindKeyOnCurrentKeyboardLayout("\\");
keyControl.wasPressedThisFrame //押した瞬間
他にも、記号系のキー "^", "@", "[", "]", :なども日本語キーボードだと位置が違うので注意が必要だ。これらも displayName から、前述の "Backslash" のように control path の方が良いかも知れない。
・Windows 日本語キーボードでの記号の InputSystem.Key 一覧
あと、まだバージョンが低いからか(掲載時点:InputSystem 1.0.0)、日本語変換キーや CapsLock キーを使うと InputSystem は不安定になる(?)ようだ(Keyboard.current.anyKey.~などが使えなくなったりする ← Unity公式にバグレポートとして出したが、「問題を確認できず」と返信が来た。もしかしたら、使っているキーボードによるのかも知れない:Windows日本語106キーボードとか、Shiftを押してCapsLockをするタイプのみとか、メーカーとか、ハードウェア依存がある?)。
まだしばらくは安定するまで、機能キーなど特殊なキーはなるべく避けた方が良いかも知れない。
●(旧)KeyCode と InputSystem.Key の対応 一覧表
(旧)KeyCode | InputSystem.Key | 備考 |
---|---|---|
None | None | |
Backspace | Backspace | |
Tab | Tab | |
Clear | (なし) | |
Return | Enter | |
Pause | Pause | |
Escape | Escape | |
Space | Space | |
Exclaim | (なし) | |
DoubleQuote | (なし) | |
Hash | (なし) | |
Dollar | (なし) | |
Percent | (なし) | |
Ampersand | (なし) | |
Quote | Quote | 日本語キーボードでは Key.Equals になる |
LeftParen | (なし) | |
RightParen | (なし) | |
Asterisk | (なし) | |
Plus | (なし) | |
Comma | Comma | |
Minus | Minus | |
Period | Period | |
Slash | Slash | |
Alpha0 | Digit0 | |
Alpha1 | Digit1 | |
Alpha2 | Digit2 | |
Alpha3 | Digit3 | |
Alpha4 | Digit4 | |
Alpha5 | Digit5 | |
Alpha6 | Digit6 | |
Alpha7 | Digit7 | |
Alpha8 | Digit8 | |
Alpha9 | Digit9 | |
Colon | (なし) | |
Semicolon | Semicolon | 日本語キーボードでは Key.Quote になる |
Less | (なし) | |
Equals | Equals | 日本語キーボードでは Key.Semicolon になる |
Greater | (なし) | |
Question | (なし) | |
At | (なし) | |
LeftBracket | LeftBracket | 日本語キーボードでは Key.RightBracket になる |
Backslash | Backslash | 日本語キーボードでは、KeyCode.Backslash で [\_] と [\|] キーが反応するが、InputSystem では InputSystem.Key.OEM2 で [\_] が反応する? |
RightBracket | RightBracket | 日本語キーボードでは Key.Backslash になる |
Caret | (なし) | |
Underscore | (なし) | |
BackQuote | Backquote | 日本語キーボードでは Key.LeftBracket になる |
A | A | |
B | B | |
C | C | |
D | D | |
E | E | |
F | F | |
G | G | |
H | H | |
I | I | |
J | J | |
K | K | |
L | L | |
M | M | |
N | N | |
O | O | |
P | P | |
Q | Q | |
R | R | |
S | S | |
T | T | |
U | U | |
V | V | |
W | W | |
X | X | |
Y | Y | |
Z | Z | |
LeftCurlyBracket | (なし) | |
Pipe | (なし) | |
RightCurlyBracket | (なし) | |
Tilde | (なし) | |
Delete | Delete | |
Keypad0 | Numpad0 | |
Keypad1 | Numpad1 | |
Keypad2 | Numpad2 | |
Keypad3 | Numpad3 | |
Keypad4 | Numpad4 | |
Keypad5 | Numpad5 | |
Keypad6 | Numpad6 | |
Keypad7 | Numpad7 | |
Keypad8 | Numpad8 | |
Keypad9 | Numpad9 | |
KeypadPeriod | NumpadPeriod | |
KeypadDivide | NumpadDivide | |
KeypadMultiply | NumpadMultiply | |
KeypadMinus | NumpadMinus | |
KeypadPlus | NumpadPlus | |
KeypadEnter | NumpadEnter | |
KeypadEquals | NumpadEquals | |
UpArrow | UpArrow | |
DownArrow | DownArrow | |
RightArrow | RightArrow | |
LeftArrow | LeftArrow | |
Insert | Insert | |
Home | Home | |
End | End | |
PageUp | PageUp | |
PageDown | PageDown | |
F1 | F1 | |
F2 | F2 | |
F3 | F3 | |
F4 | F4 | |
F5 | F5 | |
F6 | F6 | |
F7 | F7 | |
F8 | F8 | |
F9 | F9 | |
F10 | F10 | |
F11 | F11 | |
F12 | F12 | |
F13 | (なし) | |
F14 | (なし) | |
F15 | (なし) | |
Numlock | NumLock | |
CapsLock | CapsLock | |
ScrollLock | ScrollLock | |
RightShift | RightShift | |
LeftShift | LeftShift | |
RightControl | RightCtrl | |
LeftControl | LeftCtrl | |
RightAlt | RightAlt | ※AltGr 参照 |
LeftAlt | LeftAlt | |
RightCommand | RightCommand | KeyCode.RightCommand(309),.RightApple(309),.RightWindows(312)は整数値が一部異なるが、InputSystem.Key.RightCommand(58)と.RightApple(58),.RightWindows(58),.RightMeta(58)は同じ |
RightApple | RightApple | ※RightCommand 参照 |
LeftCommand | LeftCommand | KeyCode.LeftCommand(310),.LeftApple(310),.LeftWindows(311)は整数値が一部異なるが、InputSystem.Key.LeftCommand(57)と.LeftApple(57),.LeftWindows(57),.LeftMeta(57)は同じ |
LeftApple | LeftApple | ※LeftCommand 参照 |
LeftWindows | LeftWindows | ※LeftCommand 参照 |
RightWindows | RightWindows | ※RightCommand 参照 |
AltGr | AltGr | KeyCode.AltGr(313)と.RightAlt(307)は整数値が異なるが、InputSystem.Key.AltGr(54)と.RightAlt(54)は同じ |
Help | (なし) | |
PrintScreen | ※SysReq 参照 | |
SysReq | (なし) | 日本語キーボードだと [PrtScn] キーになる? |
Break | (なし) | |
Menu | ContextMenu |
マニュアルを見てると、「No corresponding API yet.」(まだ対応するものがない)というのがいくつもあるので、全て新旧一致できるわけではないようだが、よく使われる機能なら完全互換でいけそうなものも多いね。
ただ、今まで使っていた (旧)InputManager のコード(※主に Input) は全て書き換えないとならないので、大変な労力がいるのが難点。なので、しばらくは一部機能だけ使う感じになるだろう。
いずれ、スワイプ, ピンチ, 長押しなどのライブラリも InputSystem に対応しようと思っているが、ラッパー関数でも作らないと、旧新互換で作るのは骨が折れるね(笑)。
(関連記事)
【Unity】【C#】InputSystem.Key をリアルタイムで調べる / Windows 日本語キーボードでの Key 一覧
【Unity】【C#】KeyCode をリアルタイムで調べる / Windows 日本語キーボードでの記号の KeyCode 一覧
【Unity】【C#】InputSystem の Keyboard クラスと (旧)Input.GetKey の対応
【Unity】【C#】InputSystem で Android のバックキーの isPressed がなぜか一定時間で false になる?
【Unity】【C#】InputSystem の displayName や control path から Key (キーコード) を取得する
【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/369-73ed7e8c
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |