- 2020/10/14 【Unity】【C#】InputSystem で Android のバックキーの isPressed がなぜか一定時間で false になる?
- 2020/10/11 【Unity】【C#】InputSystem でマウスのホイール(scroll)取得と (旧)Input との対応
- 2020/10/08 【Unity】【C#】InputSystem の displayName や control path から Key (キーコード) を取得(変換)する
- 2020/10/07 【Unity】【C#】(旧)KeyCode と InputSystem.Key の対応
- 2020/10/06 【Unity】【C#】InputSystem.Key をリアルタイムで調べる / Windows 日本語キーボードでの Key 一覧
【Unity】【C#】InputSystem で Android のバックキーの isPressed がなぜか一定時間で false になる? 
2020/10/14 Wed [edit]
InputSystem も Verified (正式版) となり、(旧)InputManager との混在も可能でもあるが、いずれ InputSystem の方法を中心として使いたいので調査中。
Android ではあまりハードウェアキーボードの概念は無いが(オプションで付けるのは別として)、バックキーは (旧)InputManager 時代から、Input.GetKeyDown(KeyCode.Escape) で取得できる。
InputSystem でも Keyboard.current[Key.Escape] でも取得できたので、色々実験していたら、少し Input とは違う挙動を発見した。バグなのか仕様なのかわからないので(一応 Unity公式にバグレポートとして送っておいた → 再現できたので、後のバージョンで対応するとのこと)、同じ問題に出くわす人のために、とりあえず記録だけしておこう。
(※) Unity 2019.4.12f1 / InputSystem 1.0.0 / Windows10(x64) で確認
問題というのはタイトルにもおおよそ書いてあるが、具体的には「Android でバックキーの長押しを試していたら、一定時間で勝手に isPressed が false になってしまい、挙動が変わってしまった」というものだった。
実はこの「バックキーの長押し判定」というのは、私が配布しているプラグインのデモにも使われているのだが、それを InputSystem に書き換えて試していたら、上手く動かなかった事で見つけた。
少なくとも Input.GetKeyDown(KeyCode.Escape) では長く押しても判定できたのだが、InputSystem の場合、約1秒前後、バックキーを押していると、なぜか Keyboard.current[Key.Escape] は false になってしまうようだ(※エディタや Standalone ではならない。Android ランタイムのみ)。
とりあえず、試した簡単な実験用コードを載せておこう。
なんてことはない、ただ「バックキーを押す→継続→離す」といった動作をログに出しているだけだ。実際には Android の実機ではログが見えないので、プラグインに入っている XDebug.Log を使っている。
●簡単な実験用コード
using System;
using UnityEngine;
#if ENABLE_INPUT_SYSTEM
using UnityEngine.InputSystem;
#endif
public class AndroidBackKeyTest : MonoBehaviour
{
#if ENABLE_INPUT_SYSTEM
public Key targetKey = Key.Escape;
public KeyCode targetKeyCode = KeyCode.Escape;
// Use this for initialization
private void Start()
{
Debug.Log($"Platform : {Application.platform}");
Debug.Log($"SystemInfo.operatingSystem : {SystemInfo.operatingSystem}");
}
bool keyPressing;
bool keyCodePressing;
float keyPassedTime;
float keyCodePassedTime;
// Update is called once per frame
private void Update()
{
if (Keyboard.current[targetKey].wasPressedThisFrame)
{
keyPressing = true;
keyPassedTime = Time.time;
Debug.Log($"<color=cyan>[frame:{Time.frameCount}][passed:0.000] [{targetKey}].wasPressedThisFrame</color>");
}
if (Input.GetKeyDown(targetKeyCode))
{
keyCodePressing = true;
keyCodePassedTime = Time.time;
Debug.Log($"[<color=cyan>frame:{Time.frameCount}][passed:0.000] GetKeyDown({targetKeyCode})</color>");
}
if (keyPressing)
{
if (Keyboard.current[targetKey].isPressed)
{
Debug.Log($"[frame:{Time.frameCount}][passed:{(Time.time - keyPassedTime):F3}] [{targetKey}].isPressed");
}
if (Keyboard.current[targetKey].wasReleasedThisFrame)
{
Debug.Log($"<color=magenta>[frame:{Time.frameCount}][passed:{(Time.time - keyPassedTime):F3}] [{targetKey}].wasPressedThisFrame</color>");
keyPressing = false;
}
}
if (keyCodePressing)
{
if (Input.GetKey(targetKeyCode))
{
Debug.Log($"<color=#999999>[frame:{Time.frameCount}][passed:{(Time.time - keyCodePassedTime):F3}] GetKey({targetKeyCode})</color>");
}
if (Input.GetKeyUp(targetKeyCode))
{
Debug.Log($"<color=magenta>[frame:{Time.frameCount}][passed:{(Time.time - keyCodePassedTime):F3}] GetKeyUp({targetKeyCode})</color>");
keyCodePressing = false;
}
}
}
#endif
}
●短い間だけバックキーを押したとき![]() | ●1秒以上押したとき![]() |
スクショでは、「短い間だけバックキーを押したとき」と「1秒以上押したとき」のログの状態をキャプチャしている。これを見ると、通常なら、"Input.GetKey(KeyCode)" と "Keyboard.current[Key].isPressed" がペアで出ているのが正しいのだが、なぜか1秒前後以降で "Keyboard.current[Key].isPressed" の方が出てこないことがわかる(「指を離す」操作は出ている[マゼンタの色])。
ただし、この現象はエディタや Standalone でビルドした場合は出ない。正常にペアでログは表示される。
ちなみに、isPressed を使わないで、継続も判定するなら、以下のような条件分けすれば、事足りる(普通の機器なら、キーはユニークなので、押したときにフラグを上げて、離したときフラグを下げれば、それ以外でフラグがtrueのとき、継続となる)。
bool keyPressing;
private void Update()
{
if (Keyboard.current[targetKey].wasPressedThisFrame)
{
keyPressing = true;
//押したときの処理
}
if (keyPressing)
{
if (Keyboard.current[targetKey].wasReleasedThisFrame)
{
//離したときの処理
keyPressing = false;
}
else
{
//継続中の処理
}
}
}
ただ、以前の記事に『日本語変換キーや CapsLock キーを使うと(単体で CapsLock を押すとおかしくなる)、Keyboard.current.anyKey が利かなくなることがある』と書いたが、Unity公式からは「現象を確認できない」と返信が来ている。もしかしたら、私は「Windows 日本語106キーボード」だが、Unityの中の人は「Mac 英語104キーボード」など、ハードウェアで結果の違いがあるのかも知れない。なので、Android も Galaxy と Xperia で違う、なんて可能性もある(掲載時点: InputSystem 1.0.0)。
ググって過去記事を見ていても(Preview時代)、日本語機能が使えない、みたいな話は出てくるしね。まだ InputSystem も初期バージョンは問題があるかも知れない。
ただ幸いなことに、今の所、(旧)InputManager と InputSystem は共存できるので(Edit>Player Settings>Other Settings>Active Input Handling で Both を選択すれば、同時に使える)、しばらくは安定してない関数(私の見たところだと、Keyboard.current.anyKey などは、日本語入力や CapsLock など、入力方法を変更すると、機能が無効になったりすることがある ← ただし使っているハードウェアによるかも?)は (旧)Input を使った方が良いだろう。マウスホイールの戻値の単位が違うことも確認してるし、Input は静的なメソッドなので、そのまま使えていたが、InputSystm は 各 class で定義されているので、null チェックしないと、脱着されたときにヌルポが出るかも知れない。
細かい挙動が違う可能性もあるので、一気に InputSystem に移行すると、痛い目にあう気がする。しばらくは色々な機器で試してから導入・移行を検討した方が良いかも知れない(一部の人だけ使えなくなる、なんてトラブルが発生する恐れがある)。
マニュアルを見てると、「No corresponding API yet.」(まだ対応するものがない)というのがいくつもあるので、全て新旧一致できるわけではないようだが、よく使われる機能なら完全互換でいけそうなものも多いね。
ただ、今まで使っていた (旧)InputManager のコード(※主に Input) は全て書き換えないとならないので、大変な労力がいるのが難点。なので、しばらくは一部機能だけ使う感じになるだろう。
いずれ、スワイプ, ピンチ, 長押しなどのライブラリも InputSystem に対応しようと思っているが、ラッパー関数でも作らないと、旧新互換で作るのは骨が折れるね(笑)。
(関連記事)
【Unity】【C#】InputSystem.Key をリアルタイムで調べる / Windows 日本語キーボードでの Key 一覧
【Unity】【C#】InputSystem の Keyboard クラスと (旧)Input.GetKey の対応
【Unity】【C#】(旧)KeyCode と InputSystem.Key の対応
【Unity】【C#】InputSystem の Mouse クラスと(旧)Input.GetMouseButton の対応
【Unity】【C#】InputSystem でマウスのホイール(scroll)取得と (旧)Input との対応
【Unity】【C#】InputSystem.TouchPhase の IsActive(), IsEndedOrCanceled() [拡張メソッド] の具体値
【Unity】【C#】InputSystem の displayName や control path から Key (キーコード) を取得(変換)する
【Unity】【C#】InputSystem でマウスのホイール(scroll)取得と (旧)Input との対応 
2020/10/11 Sun [edit]
InputSystem も Verified (正式版) となり、(旧)InputManager との混在も可能でもあるが、いずれ InputSystem の方法を中心として使いたいので調査中。
少し前に「Mouse クラスと (旧)Input.GetMouseButton の対応 」はおおよそ同じ値になったが、マウスホイールを試してみたら、少し値が異なるので、調べてみた。と言っても使い方はあまり変わらないので、軽く見ておくだけで理解できると思う。
(※) Unity 2019.4.12f1 / InputSystem 1.0.0 / Windows10(x64) で確認
●簡単な実験用コード
using UnityEngine;
#if ENABLE_INPUT_SYSTEM
using UnityEngine.InputSystem;
#endif
public class MouseWheelTest : MonoBehaviour
{
private void Update()
{
var mouseAxis = Input.GetAxis("Mouse ScrollWheel");
if (mouseAxis != 0)
{
Debug.Log($"[frame: {Time.frameCount}] Input.GetAxis(Mouse ScrollWheel) = {mouseAxis:F3}");
}
var mouseDelta = Input.mouseScrollDelta;
if (mouseDelta != Vector2.zero)
{
Debug.Log($"[frame: {Time.frameCount}] Input.mouseScrollDelta = {mouseDelta.ToString("F3")}");
}
#if ENABLE_INPUT_SYSTEM
var mouseScroll = Mouse.current.scroll.ReadValue();
if (mouseScroll != Vector2.zero)
{
Debug.Log($"[frame: {Time.frameCount}] Mouse.current.scroll = {mouseScroll.ToString("F3")}");
}
#endif
}
}

デフォルトの設定では、ホイールを後ろ方向(自分側)に回せば、負の値となり、前進方向に回せば、正の値となる。各メソッドで基準量が違うが、その定数倍が戻値になると考えて良い。
今回は、Input.GetAxis, Input.mouseScrollDelta, Mouse.current.scroll で比較してみたが、それぞれ、0.1, 1, 120 の倍数が出ている(素早く回すと、3倍、5倍…となる)。
この Mouse.current.scroll の 120 は何なんだろう?とマニュアルを見てみたが、どうやらピクセル量を表しているようだ。といっても私の場合、デスクトップPCに繋いだ物理マウスだったので、値が固定なのだが(機器に依存するのかも?)、例えば、ノートPCのパッドでスクロールするときなどは、量が変化するのかも知れない(※未確認)。
マニュアル抜粋 (Google 翻訳)
また、Input.mouseScrollDelta と Mouse.current.scroll は Vector2 が戻値であるが、Input.mouseScrollDelta の Vector2.x は無視(常に 0)、Mouse.current.scroll の方は機器によっては横方向の動きも取れるようだ(※未確認)。ちなみに、OS でマウスのスクロール量の設定を変えても、Unity 上の値は変わらなかった。
マニュアル抜粋 (翻訳)
なお、Input.GetAxis の値は (旧)InputManager(Edit>Project Settings...>Input Manager)の設定に依存する。各 Axes(ここでは "Mouse ScrollWheel" となっているが、名前は自由に付けられる)の設定で「Sensitivity」の値が基準量で、この定数倍になる。つまりこの実験ではデフォ値(0.1)でやってしまったが、Sensitivity を 1 にすれば、Input.mouseScrollDelta.y と全く同じ値となる。

互換性を考えると、Mouse.current.scroll を一定の pixel 値で割れば良いが、マウス機器の精度で値が変わるかも知れないので、ちょっとやっかいだね(この実験での場合、.y/120 で比率が計算できるが、他の機器だと値が違う可能性がある)。InputSystem をアプリに導入する場合、ピクセル単位でのホイール用 Sensitivity 設定項目でも追加しないと、その人のマウス機器によって結果が変わってしまうかもなぁ…。|||orz
(参考)
・Mouse support
・Mouse.scroll
・Input.GetAxis
・Input.mouseScrollDelta
マニュアルを見てると、「No corresponding API yet.」(まだ対応するものがない)というのがいくつもあるので、全て新旧一致できるわけではないようだが、よく使われる機能なら完全互換でいけそうなものも多いね。
ただ、今まで使っていた (旧)InputManager のコード(※主に Input) は全て書き換えないとならないので、大変な労力がいるのが難点。なので、しばらくは一部機能だけ使う感じになるだろう。
いずれ、スワイプ, ピンチ, 長押しなどのライブラリも InputSystem に対応しようと思っているが、ラッパー関数でも作らないと、旧新互換で作るのは骨が折れるね(笑)。
(関連記事)
【Unity】【C#】InputSystem の Mouse クラスと(旧)Input.GetMouseButton の対応
【Unity】5ボタンマウスの KeyCode 図解
【Unity】【C#】InputSystem.TouchPhase の IsActive(), IsEndedOrCanceled() [拡張メソッド] の具体値
【Unity】【C#】(旧)KeyCode と InputSystem.Key の対応
【Unity】【C#】InputSystem.Key をリアルタイムで調べる / Windows 日本語キーボードでの Key 一覧
【Unity】【C#】KeyCode をリアルタイムで調べる / Windows 日本語キーボードでの記号の KeyCode 一覧
【Unity】【C#】InputSystem の Keyboard クラスと (旧)Input.GetKey の対応
【Unity】【C#】InputSystem の displayName や control path から Key (キーコード) を取得(変換)する
【Unity】【C#】InputSystem の displayName や control path から Key (キーコード) を取得(変換)する 
2020/10/08 Thu [edit]
InputSystem も Verified (正式版) となり、(旧)InputManager との混在も可能でもあるが、いずれ InputSystem の方法を中心として使いたいので調査中。
「InputSystem.Key と実際の(日本語)キーボードとの対応を調べた」にも少し書いたが、InputSystem のキーは物理配列に依存し、基本的に英語キーボードが enum の名前となっているので、日本語キーボードだと特に記号系が使いにくい。
(旧)KeyCode でも記号は使いづらかったが、幸いなことに InputSystem では現在のキーボードレイアウトから Key を逆引きできるようだ。これを使えば、日本語キーボードや英語キーボード等に依存することなく、ある程度は記号も使えるかも知れない(といっても、101 キーボードなど、無いキーはどうにもならないだろうが…)。
(参考)
・キーボード。日本語配列と英語配列。
・101/104/109…キーボード配列、種類、構造についての解説と一覧
・キー配列
(※) Unity 2019.4.11f1 / InputSystem 1.0.0 / Windows10(x64) で確認
■displayName と control path の簡単なテスト
とりあえずの簡単な実験用コードなので、書き方とかは気にしないで欲しい(笑)。
なお、[A]~[Z] などは特記することもないので、ここでは、記号系のキーのみでやっている。
using UnityEngine;
#if ENABLE_INPUT_SYSTEM
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
#endif
public class KeyboardDisplayNameTest : MonoBehaviour
{
#if ENABLE_INPUT_SYSTEM
private void Start()
{
KeyboardDisplayNameCheck();
}
void KeyboardDisplayNameCheck()
{
{
var keyControlFromLayout = Keyboard.current.FindKeyOnCurrentKeyboardLayout("\\");
Debug.Log("[\\] from keyboard layout : " + keyControlFromLayout.keyCode);
var keyControlFromPath = (KeyControl)Keyboard.current["#(\\\\)"];
Debug.Log("[\\] from control path : " + keyControlFromPath.keyCode);
}
{
var keyControlFromLayout = Keyboard.current.FindKeyOnCurrentKeyboardLayout("^");
Debug.Log("[^] from keyboard layout : " + keyControlFromLayout.keyCode);
var keyControlFromPath = (KeyControl)Keyboard.current["#(^)"];
Debug.Log("[^] from control path : " + keyControlFromPath.keyCode);
}
{
var keyControlFromLayout = Keyboard.current.FindKeyOnCurrentKeyboardLayout("-");
Debug.Log("[-] from keyboard layout : " + keyControlFromLayout.keyCode);
var keyControlFromPath = (KeyControl)Keyboard.current["#(-)"];
Debug.Log("[-] from control path : " + keyControlFromPath.keyCode);
}
{
var keyControlFromLayout = Keyboard.current.FindKeyOnCurrentKeyboardLayout("@");
Debug.Log("[@] from keyboard layout : " + keyControlFromLayout.keyCode);
var keyControlFromPath = (KeyControl)Keyboard.current["#(@)"];
Debug.Log("[@] from control path : " + keyControlFromPath.keyCode);
}
{
var keyControlFromLayout = Keyboard.current.FindKeyOnCurrentKeyboardLayout("[");
Debug.Log("[[] from keyboard layout : " + keyControlFromLayout.keyCode);
var keyControlFromPath = (KeyControl)Keyboard.current["#([)"];
Debug.Log("[[] from control path : " + keyControlFromPath.keyCode);
}
{
var keyControlFromLayout = Keyboard.current.FindKeyOnCurrentKeyboardLayout("]");
Debug.Log("[]] from keyboard layout : " + keyControlFromLayout.keyCode);
var keyControlFromPath = (KeyControl)Keyboard.current["#(])"];
Debug.Log("[]] from control path : " + keyControlFromPath.keyCode);
}
{
var keyControlFromLayout = Keyboard.current.FindKeyOnCurrentKeyboardLayout(":");
Debug.Log("[:] from keyboard layout : " + keyControlFromLayout.keyCode);
var keyControlFromPath = (KeyControl)Keyboard.current["#(:)"];
Debug.Log("[:] from control path : " + keyControlFromPath.keyCode);
}
{
var keyControlFromLayout = Keyboard.current.FindKeyOnCurrentKeyboardLayout(";");
Debug.Log("[;] from keyboard layout : " + keyControlFromLayout.keyCode);
var keyControlFromPath = (KeyControl)Keyboard.current["#(;)"];
Debug.Log("[;] from control path : " + keyControlFromPath.keyCode);
}
{
var keyControlFromLayout = Keyboard.current.FindKeyOnCurrentKeyboardLayout(",");
Debug.Log("[,] from keyboard layout : " + keyControlFromLayout.keyCode);
var keyControlFromPath = (KeyControl)Keyboard.current["#(,)"];
Debug.Log("[,] from control path : " + keyControlFromPath.keyCode);
}
{
var keyControlFromLayout = Keyboard.current.FindKeyOnCurrentKeyboardLayout(".");
Debug.Log("[.] from keyboard layout : " + keyControlFromLayout.keyCode);
var keyControlFromPath = (KeyControl)Keyboard.current["#(.)"];
Debug.Log("[.] from control path : " + keyControlFromPath.keyCode);
}
{
var keyControlFromLayout = Keyboard.current.FindKeyOnCurrentKeyboardLayout("/");
Debug.Log("[/] from keyboard layout : " + keyControlFromLayout.keyCode);
var keyControlFromPath = (KeyControl)Keyboard.current["#(\\/)"];
Debug.Log("[/] from control path : " + keyControlFromPath.keyCode);
}
}
#endif
}
[\] from control path : OEM2
[^] from keyboard layout : Equals
[^] from control path : Equals
[-] from keyboard layout : Minus
[-] from control path : Minus
[@] from keyboard layout : LeftBracket
[@] from control path : LeftBracket
[[] from keyboard layout : RightBracket
[[] from control path : RightBracket
[]] from keyboard layout : Backslash
[]] from control path : Backslash
[:] from keyboard layout : Quote
[:] from control path : Quote
[;] from keyboard layout : Semicolon
[;] from control path : Semicolon
[,] from keyboard layout : Comma
[,] from control path : Comma
[.] from keyboard layout : Period
[.] from control path : Period
[/] from keyboard layout : Slash
[/] from control path : Slash
[-]キーと Minus, [;]キーと Semicolon, [,]キーと Comma, [.]キーと Period, [/]キーと Slash は日本語キーボードとも合っているが、それ以外は英語キーボードの物理位置になっていることがわかる。海外でも対応できるアプリを作るなら、記号の利用は注意が必要かも知れない。
その中でも少し特異なのが、バックスラッシュ(日本語では"\"でもある)だけは「OEM2」となっていることだ。この「OEM~」はどうやら、104, 106, … キーボードのように数が違うとき、追加されたキーになるらしい(英語キーボードと日本語キーボードを比較してみるとわかるが、英語配列には日本語配列の [\_][\|] の物理位置に、キーが存在しない)。なので、キーボードによってはあったりなかったりするのかも知れない(※未確認)。
余談だが、コードで中括弧で囲む表記 "{"~"}" を多用しているが、中括弧はローカル変数のスコープを限定できるので、同じ変数名を1つのメソッド内で使うのに有効な手段になったりする。以前、仕事のコードレビューで「条件文ないのに中括弧があるよ」と指摘された(コードがおかしいと言われた)ことがあるが、このテクニックは初期の C言語の時代(80年代)から存在する(switch 文で使うとかなり便利。1つのメソッドに大量に変数名を書くよりわかりやすい利点もある。なぜかこの使い方をベテランでも知らない人が多い?実は割と基本中の基本である ← 私は仕事で人から教わるより、独学が多いためか、学生時代に超初心者向けのC言語の本で学んだことをハッキリと覚えている)。
■displayName や control path から Key (キーコード) を取得する
簡単なテストでわかったように、displayName や control path("#(a)" のような書き方)を使えば KeyControl を取得できる(ちなみに KeyControl (InputControl) をそのまま ToString() すれば、フルパス(?正式な名称ではないが、長いパス名)が見れる)。
プロパティ:KeyControl.keyCode から Key が取得できるので、displayName や control path から InputSystem.Key を取得するメソッドを定義してみよう。
●displayName や control path → InputSystem.Key 取得メソッド
using UnityEngine;
#if ENABLE_INPUT_SYSTEM
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
#endif
#if ENABLE_INPUT_SYSTEM
/// <summary>
/// displayName から Key (enum) を取得する.
/// ※失敗は None になる。None 自体は取得できない。
/// https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/Controls.html#control-paths
/// http://fantom1x.blog130.fc2.com/blog-entry-370.html
/// </summary>
/// <param name="displayName">例: "a", "/", "\\" 等</param>
/// <returns></returns>
public static Key GetKeyFromDisplayName(string displayName)
{
try
{
var control = Keyboard.current.FindKeyOnCurrentKeyboardLayout(displayName);
return control.keyCode;
}
catch (Exception e)
{
#if UNITY_EDITOR
Debug.LogError($"displayName = {displayName} : {e.Message}");
#endif
}
return Key.None; //失敗
}
/// <summary>
/// control path から Key (enum) を取得する.
/// ※失敗は None になる。None 自体は取得できない。
/// https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/Controls.html#control-paths
/// http://fantom1x.blog130.fc2.com/blog-entry-370.html
/// </summary>
/// <param name="controlPath">例: "#(a)", "#(\\/)", "#(\\\\)" 等</param>
/// <returns>成功 = None 以外 / 失敗 = None</returns>
public static Key GetKeyFromControlPath(string controlPath)
{
try
{
var control = (KeyControl)Keyboard.current[controlPath];
return control.keyCode;
}
catch (Exception e)
{
#if UNITY_EDITOR
Debug.LogError($"controlPath = {controlPath} : {e.Message}");
#endif
}
return Key.None; //失敗
}
#endif
//使い方
var backslashKey = GetKeyFromDisplayName("\\"); //OEM2
var aKey = GetKeyFromControlPath("#(a)"); //A
引数は文字列であり、1文字間違えただけでもエラーとなるので、try-catch で囲んでおいた。
また、取得失敗時には Key.None を返すようにしておいた。ちなみに Input 系メソッドで KeyCode.None を使ってもエラーにならないが、InputSystem では Keyboard.current[Key.None] のように使うとエラーとなるので注意しよう。
実際に使用するときは、毎回取得させるより、結果をキャッシュして使いまわした方がパフォーマンスが良いだろう。
もし、キーボードの種類に依存しないでキーが取得できるなら、かえって KeyCode より使い勝手が良くなるかも知れない。ただ現バージョン(1.0.0)では漢字変換キーや CapsLock を使おうとすると不具合を起こしたりするので、使うなら気をつけないといけないかも(← Unity公式にバグレポートとして出したが、「問題を確認できず」と返信が来た。もしかしたら、使っているキーボードによるのかも知れない:Windows日本語106キーボードとか、Shiftを押してCapsLockをするタイプのみとか、メーカーとか、ハードウェア依存がある?)。まだまだ仕様なのか不具合なのか、よくわからない事も多いので、色々試してみる必要がありそうだ(笑)。
マニュアルを見てると、「No corresponding API yet.」(まだ対応するものがない)というのがいくつもあるので、全て新旧一致できるわけではないようだが、よく使われる機能なら完全互換でいけそうなものも多いね。
ただ、今まで使っていた (旧)InputManager のコード(※主に Input) は全て書き換えないとならないので、大変な労力がいるのが難点。なので、しばらくは一部機能だけ使う感じになるだろう。
いずれ、スワイプ, ピンチ, 長押しなどのライブラリも InputSystem に対応しようと思っているが、ラッパー関数でも作らないと、旧新互換で作るのは骨が折れるね(笑)。
(関連記事)
【Unity】【C#】(旧)KeyCode と InputSystem.Key の対応
【Unity】【C#】InputSystem.Key をリアルタイムで調べる / Windows 日本語キーボードでの Key 一覧
【Unity】【C#】KeyCode をリアルタイムで調べる / Windows 日本語キーボードでの記号の KeyCode 一覧
【Unity】【C#】InputSystem の Keyboard クラスと (旧)Input.GetKey の対応
【Unity】【C#】InputSystem の Mouse クラスと(旧)Input.GetMouseButton の対応
【Unity】【C#】InputSystem でマウスのホイール(scroll)取得と (旧)Input との対応
【Unity】【C#】InputSystem.TouchPhase の IsActive(), IsEndedOrCanceled() [拡張メソッド] の具体値
【Unity】5ボタンマウスの KeyCode 図解
【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 図解
【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 図解