FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Unity »【Unity】【C#】InputSystem.Key をリアルタイムで調べる / Windows 日本語キーボードでの Key 一覧

【Unity】【C#】InputSystem.Key をリアルタイムで調べる / Windows 日本語キーボードでの Key 一覧  


 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 は海外製なので、基本的には英語配列キーボードを見て確かめた方が良いだろう。私が調べてみた結果は後述の一覧にまとめた。

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


 ちなみに、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)SpaceSpace
Enter (2)EnterEnter
Tab (3)TabTab
Backquote (4)半角/全角 漢字半角/全角
Quote (5):*:
Semicolon (6);+;
Comma (7),<,
Period (8).>.
Slash (9)/?/
Backslash (10)]}]
LeftBracket (11)@`@
RightBracket (12)[{[
Minus (13)-=-
Equals (14)^~^
A (15)AA
B (16)BB
C (17)CC
D (18)DD
E (19)EE
F (20)FF
G (21)GG
H (22)HH
I (23)II
J (24)JJ
K (25)KK
L (26)LL
M (27)MM
N (28)NN
O (29)OO
P (30)PP
Q (31)QQ
R (32)RR
S (33)SS
T (34)TT
U (35)UU
V (36)VV
W (37)WW
X (38)XX
Y (39)YY
Z (40)ZZ
Digit1 (41)フルキー 11
Digit2 (42)フルキー 22
Digit3 (43)フルキー 33
Digit4 (44)フルキー 44
Digit5 (45)フルキー 55
Digit6 (46)フルキー 66
Digit7 (47)フルキー 77
Digit8 (48)フルキー 88
Digit9 (49)フルキー 99
Digit0 (50)フルキー 00
LeftShift (51)左 ShiftShift
RightShift (52)右 ShiftRight Shift
LeftAlt (53)左 AltAlt
RightAlt (54)右 AltRight Alt
AltGr (54)右 AltRight AltRightAlt (54) と値重複(別名)
LeftCtrl (55)左 CtrlCtrl
RightCtrl (56)右 CtrlRight Control
LeftMeta (57)WindowsキーLeft Windows
LeftWindows (57)WindowsキーLeft WindowsLeftMeta (57) と値重複(別名)
LeftCommand (57)WindowsキーLeft WindowsLeftMeta (57) と値重複(別名)
LeftApple (57)WindowsキーLeft WindowsLeftMeta (57) と値重複(別名)
RightCommand (58)右 Windowsキー(※未確認)Right Windows英語キーボードでの場合。日本語キーボードの変換キー等は反応しない
RightMeta (58)右 Windowsキー(※未確認)Right WindowsRightCommand (58) と値重複(別名)
RightWindows (58)右 Windowsキー(※未確認)Right WindowsRightCommand (58) と値重複(別名)
RightApple (58)右 Windowsキー(※未確認)Right WindowsRightCommand (58) と値重複(別名)
ContextMenu (59)メニューキーApplication
Escape (60)EscEsc
LeftArrow (61)Left
RightArrow (62)Right
UpArrow (63)Up
DownArrow (64)Down
Backspace (65)BackspaceBackspace
PageDown (66)PgDnPage Down
PageUp (67)PgUpPage Up
Home (68)HomeHome
End (69)EndEnd
Insert (70)InsertInsert
Delete (71)DeleteDelete
CapsLock (72)CapsLockCaps LockCapsLockを使うとおかしくなることがある(※キーボードによるかも?) [※InputSystem 1.0.0 時点]
NumLock (73)NumLockPause
PrintScreen (74)PrintPrint Screen
ScrollLock (75)ScrollLockScroll Lock
Pause (76)PauseBreak
NumpadEnter (77)テンキー EnterNum Enter
NumpadDivide (78)テンキー /Num /
NumpadMultiply (79)テンキー *Num *
NumpadPlus (80)テンキー +Num +
NumpadMinus (81)テンキー -Num -
NumpadPeriod (82)テンキー .Num Del
NumpadEquals (83)(未確認)Numpad =
Numpad0 (84)テンキー 0Num 0
Numpad1 (85)テンキー 1Num 1
Numpad2 (86)テンキー 2Num 2
Numpad3 (87)テンキー 3Num 3
Numpad4 (88)テンキー 4Num 4
Numpad5 (89)テンキー 5Num 5
Numpad6 (90)テンキー 6Num 6
Numpad7 (91)テンキー 7Num 7
Numpad8 (92)テンキー 8Num 8
Numpad9 (93)テンキー 9Num 9
F1 (94)F1F1
F2 (95)F2F2
F3 (96)F3F3
F4 (97)F4F4
F5 (98)F5F5
F6 (99)F6F6
F7 (100)F7F7
F8 (101)F8F8
F9 (102)F9F9
F10 (103)F10F10
F11 (104)F11F11
F12 (105)F12F12
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 に対応しようと思っているが、ラッパー関数でも作らないと、旧新互換で作るのは骨が折れるね(笑)。



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







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


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



category: Unity

thread: ゲーム開発

janre: コンピュータ

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


トラックバック

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

プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop