検証不十分な意見で申しわけないのですが、もしかすると右シフトキー隣のバックスラッシュはファンクションキー扱いになっているかもしれません。
下記のようなコードで円記号キーとバックスラッシュキーの違いがあるでしょうか?
C#
1using UnityEngine;
2
3public class BackslashTest : MonoBehaviour
4{
5 private bool needsCheckBackslash;
6
7 private void Update()
8 {
9 this.needsCheckBackslash |= Input.GetKeyDown(KeyCode.Backslash);
10 }
11
12 private void OnGUI()
13 {
14 if (this.needsCheckBackslash)
15 {
16 var e = Event.current;
17 if (e.isKey)
18 {
19 if (e.functionKey)
20 {
21 Debug.Log("Backslash");
22 }
23 else
24 {
25 Debug.Log("Yen");
26 }
27
28 this.needsCheckBackslash = false;
29 }
30 }
31 }
32}
私の場合は区別できたように見えたのですが、はたしてどの環境でも通用するのかはすごく不確かです。すみません...
##追記
下記のようにもっと詳しい情報を出力させるようにしたバージョンを試してみたところ...
C#
1using UnityEngine;
2
3public class BackslashTest2 : MonoBehaviour
4{
5 private bool needsCheckBackslash;
6
7 private void Update()
8 {
9 if (Input.GetKeyDown(KeyCode.Backslash))
10 {
11 this.needsCheckBackslash = true;
12 Debug.Log($"Update frame: {Time.frameCount}");
13 }
14 }
15
16 private void OnGUI()
17 {
18 if (this.needsCheckBackslash)
19 {
20 var e = Event.current;
21 Debug.Log($"OnGUI frame: {Time.frameCount}, Event type: {e.type}");
22 if (e.isKey)
23 {
24 if (e.functionKey)
25 {
26 Debug.Log("Backslash");
27 }
28 else
29 {
30 Debug.Log("Yen");
31 }
32
33 this.needsCheckBackslash = false;
34 }
35 }
36 }
37}
ご質問者さんのご指摘通り、KeyDown
を見逃してKeyUp
時点で反応していたようでした。
どうやら「Update
でキーダウンがあったかを判断し、その後のOnGUI
で円記号かバックスラッシュか判定する」というのでは遅すぎたようです。全部OnGUI
内で完結させるよりないかもしれません。
C#
1using UnityEngine;
2
3public class BackslashTest3 : MonoBehaviour
4{
5 private void OnGUI()
6 {
7 var e = Event.current;
8 if (e.type == EventType.KeyDown)
9 {
10 // https://docs.unity3d.com/ja/current/ScriptReference/EventType.KeyDown.html によると
11 // キーを押した時にはkeyCodeを持つイベントとcharacterを持つイベントが別々に発行されるらしい
12 if (e.keyCode == KeyCode.None)
13 {
14 Debug.Log($"Character: [{e.character}]");
15 }
16 else if (e.keyCode == KeyCode.Backslash)
17 {
18 if (e.functionKey)
19 {
20 Debug.Log("Backslash");
21 }
22 else
23 {
24 Debug.Log("Yen");
25 }
26 }
27 else
28 {
29 Debug.Log(e.keyCode);
30 }
31 }
32 }
33}
##さらに追記
他にも、OnGUI
に頼らずそれぞれのキーを識別できそうな可能性として...
- パッケージマネージャーでInput Systemをインストールし、「Edit」→「Project Settings...」の「Player」→「Other Settings」→「Configulation」→「Active Input Handling*」を「Both」にして旧来の
Input
とInput Systemが同時に動作するようにしておく。
- 大部分のキーの識別は従来通り
Update
内などでInput
を使って行う。
Input
による判定でKeyCode.Backslash
が出てきた時にInput Systemによる追加判定を行う。
という手が使えるかもしれません。Input
単独で両方のキーを識別する手段がどうにも見つからず、Input Systemならどうかと思って見てみたところ、どうやらこちらはバックスラッシュキーでoem2Keyが反応するようでした。
ですが円記号キーでは無反応(どのキーコントロールにも反応がない?)のような挙動をしていましたので、Input System単独でも厳しいかもしれません。そこで両方を折衷してみました。
C#
1using System;
2using System.Linq;
3using UnityEngine;
4using UnityEngine.InputSystem;
5
6public class BackslashTest4 : MonoBehaviour
7{
8 private readonly KeyCode[] keyCodes = Enum.GetValues(typeof(KeyCode)).Cast<KeyCode>().ToArray();
9
10 private void Update()
11 {
12 // 何らかのキーが押し下げられたら...
13 if (Input.anyKeyDown)
14 {
15 // すべてのキーを走査して...
16 foreach (var key in keyCodes)
17 {
18 // キーダウンがあったかを調べ...
19 if (Input.GetKeyDown(key))
20 {
21 if (key == KeyCode.Backslash)
22 {
23 // キーコードがBackslashの時は、さらにOEM2キーに反応があるかを調べる
24 if (Keyboard.current.oem2Key.wasPressedThisFrame)
25 {
26 // 反応があれば右シフト隣のバックスラッシュ
27 Debug.Log("Backslash");
28 }
29 else
30 {
31 // 反応がなければバックスペース隣の円記号
32 Debug.Log("Yen");
33 }
34 }
35 else
36 {
37 // バックスラッシュ以外はそのまま表示
38 Debug.Log(key);
39 }
40
41 break;
42 }
43 }
44 }
45 }
46}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/20 11:35 編集
2020/10/20 11:10
2020/10/20 14:30
2020/10/21 10:00