FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Unity »【Unity】【C#】(旧)KeyCode と InputSystem.Key の対応

【Unity】【C#】(旧)KeyCode と InputSystem.Key の対応  


 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 は海外製なので、基本的には英語配列キーボードを見て確かめた方が良いだろう。

マニュアル日本語訳)
個々のキーの位置は、キーボードのレイアウトに依存しません。つまり、たとえば、現在アクティブなキーボードレイアウトで文字を生成するキーが配置されている場所や、その文字に割り当てられたキー、レイアウトに文字がないかどうかに関係なく、Aキーは常にCapsLockキーの右側のキーになります。

(参考
キーボード。日本語配列と英語配列。
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 の対応 一覧表

(旧)KeyCodeInputSystem.Key備考
NoneNone
BackspaceBackspace
TabTab
Clear(なし)
ReturnEnter
PausePause
EscapeEscape
SpaceSpace
Exclaim(なし)
DoubleQuote(なし)
Hash(なし)
Dollar(なし)
Percent(なし)
Ampersand(なし)
QuoteQuote日本語キーボードでは Key.Equals になる
LeftParen(なし)
RightParen(なし)
Asterisk(なし)
Plus(なし)
CommaComma
MinusMinus
PeriodPeriod
SlashSlash
Alpha0Digit0
Alpha1Digit1
Alpha2Digit2
Alpha3Digit3
Alpha4Digit4
Alpha5Digit5
Alpha6Digit6
Alpha7Digit7
Alpha8Digit8
Alpha9Digit9
Colon(なし)
SemicolonSemicolon日本語キーボードでは Key.Quote になる
Less(なし)
EqualsEquals日本語キーボードでは Key.Semicolon になる
Greater(なし)
Question(なし)
At(なし)
LeftBracketLeftBracket日本語キーボードでは Key.RightBracket になる
BackslashBackslash日本語キーボードでは、KeyCode.Backslash で [\_] と [\|] キーが反応するが、InputSystem では InputSystem.Key.OEM2 で [\_] が反応する?
RightBracketRightBracket日本語キーボードでは Key.Backslash になる
Caret(なし)
Underscore(なし)
BackQuoteBackquote日本語キーボードでは Key.LeftBracket になる
AA
BB
CC
DD
EE
FF
GG
HH
II
JJ
KK
LL
MM
NN
OO
PP
QQ
RR
SS
TT
UU
VV
WW
XX
YY
ZZ
LeftCurlyBracket(なし)
Pipe(なし)
RightCurlyBracket(なし)
Tilde(なし)
DeleteDelete
Keypad0Numpad0
Keypad1Numpad1
Keypad2Numpad2
Keypad3Numpad3
Keypad4Numpad4
Keypad5Numpad5
Keypad6Numpad6
Keypad7Numpad7
Keypad8Numpad8
Keypad9Numpad9
KeypadPeriodNumpadPeriod
KeypadDivideNumpadDivide
KeypadMultiplyNumpadMultiply
KeypadMinusNumpadMinus
KeypadPlusNumpadPlus
KeypadEnterNumpadEnter
KeypadEqualsNumpadEquals
UpArrowUpArrow
DownArrowDownArrow
RightArrowRightArrow
LeftArrowLeftArrow
InsertInsert
HomeHome
EndEnd
PageUpPageUp
PageDownPageDown
F1F1
F2F2
F3F3
F4F4
F5F5
F6F6
F7F7
F8F8
F9F9
F10F10
F11F11
F12F12
F13(なし)
F14(なし)
F15(なし)
NumlockNumLock
CapsLockCapsLock
ScrollLockScrollLock
RightShiftRightShift
LeftShiftLeftShift
RightControlRightCtrl
LeftControlLeftCtrl
RightAltRightAlt※AltGr 参照
LeftAltLeftAlt
RightCommandRightCommandKeyCode.RightCommand(309),.RightApple(309),.RightWindows(312)は整数値が一部異なるが、InputSystem.Key.RightCommand(58)と.RightApple(58),.RightWindows(58),.RightMeta(58)は同じ
RightAppleRightApple※RightCommand 参照
LeftCommandLeftCommandKeyCode.LeftCommand(310),.LeftApple(310),.LeftWindows(311)は整数値が一部異なるが、InputSystem.Key.LeftCommand(57)と.LeftApple(57),.LeftWindows(57),.LeftMeta(57)は同じ
LeftAppleLeftApple※LeftCommand 参照
LeftWindowsLeftWindows※LeftCommand 参照
RightWindowsRightWindows※RightCommand 参照
AltGrAltGrKeyCode.AltGr(313)と.RightAlt(307)は整数値が異なるが、InputSystem.Key.AltGr(54)と.RightAlt(54)は同じ
Help(なし)
PrintPrintScreen※SysReq 参照
SysReq(なし)日本語キーボードだと [PrtScn] キーになる?
Break(なし)
MenuContextMenu




 マニュアルを見てると、「No corresponding API yet.」(まだ対応するものがない)というのがいくつもあるので、全て新旧一致できるわけではないようだが、よく使われる機能なら完全互換でいけそうなものも多いね。

 ただ、今まで使っていた (旧)InputManager のコード(※主に Input) は全て書き換えないとならないので、大変な労力がいるのが難点。なので、しばらくは一部機能だけ使う感じになるだろう。

 いずれ、スワイプ, ピンチ, 長押しなどのライブラリも InputSystem に対応しようと思っているが、ラッパー関数でも作らないと、旧新互換で作るのは骨が折れるね(笑)。



スワイプ, ピンチ, 長押しなども同梱されている多機能 Android プラグイン







(関連記事)
【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 図解


関連記事
スポンサーサイト



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityリファレンス  InputSystem  一覧 
tb: 0   cm: --


トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/369-73ed7e8c
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop