回答編集履歴

3

誤字の訂正

2020/10/21 01:46

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -268,7 +268,7 @@
268
268
 
269
269
  という手が使えるかもしれません。`Input`単独で両方のキーを識別する手段がどうにも見つからず、Input Systemならどうかと思って見てみたところ、どうやらこちらはバックスラッシュキーで[oem2Key](https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_oem2Key)が反応するようでした。
270
270
 
271
- ですが円記号キーでは無反応(どのキーコントロールにも反応がない?)ような挙動をしていましたので、Input System単独でも厳しいかもしれません。そこで両方を折衷してみました。
271
+ ですが円記号キーでは無反応(どのキーコントロールにも反応がない?)ような挙動をしていましたので、Input System単独でも厳しいかもしれません。そこで両方を折衷してみました。
272
272
 
273
273
 
274
274
 

2

OnGUIを使わない方法を検討

2020/10/21 01:46

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -247,3 +247,123 @@
247
247
  }
248
248
 
249
249
  ```
250
+
251
+
252
+
253
+ ##さらに追記
254
+
255
+
256
+
257
+ 他にも、`OnGUI`に頼らずそれぞれのキーを識別できそうな可能性として...
258
+
259
+
260
+
261
+ - パッケージマネージャーでInput Systemをインストールし、「Edit」→「Project Settings...」の「Player」→「Other Settings」→「Configulation」→「Active Input Handling*」を「Both」にして旧来の`Input`とInput Systemが同時に動作するようにしておく。
262
+
263
+ - 大部分のキーの識別は従来通り`Update`内などで`Input`を使って行う。
264
+
265
+ - `Input`による判定で`KeyCode.Backslash`が出てきた時にInput Systemによる追加判定を行う。
266
+
267
+
268
+
269
+ という手が使えるかもしれません。`Input`単独で両方のキーを識別する手段がどうにも見つからず、Input Systemならどうかと思って見てみたところ、どうやらこちらはバックスラッシュキーで[oem2Key](https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_oem2Key)が反応するようでした。
270
+
271
+ ですが円記号キーでは無反応(どのキーコントロールにも反応がない?)ような挙動をしていましたので、Input System単独でも厳しいかもしれません。そこで両方を折衷してみました。
272
+
273
+
274
+
275
+ ```C#
276
+
277
+ using System;
278
+
279
+ using System.Linq;
280
+
281
+ using UnityEngine;
282
+
283
+ using UnityEngine.InputSystem;
284
+
285
+
286
+
287
+ public class BackslashTest4 : MonoBehaviour
288
+
289
+ {
290
+
291
+ private readonly KeyCode[] keyCodes = Enum.GetValues(typeof(KeyCode)).Cast<KeyCode>().ToArray();
292
+
293
+
294
+
295
+ private void Update()
296
+
297
+ {
298
+
299
+ // 何らかのキーが押し下げられたら...
300
+
301
+ if (Input.anyKeyDown)
302
+
303
+ {
304
+
305
+ // すべてのキーを走査して...
306
+
307
+ foreach (var key in keyCodes)
308
+
309
+ {
310
+
311
+ // キーダウンがあったかを調べ...
312
+
313
+ if (Input.GetKeyDown(key))
314
+
315
+ {
316
+
317
+ if (key == KeyCode.Backslash)
318
+
319
+ {
320
+
321
+ // キーコードがBackslashの時は、さらにOEM2キーに反応があるかを調べる
322
+
323
+ if (Keyboard.current.oem2Key.wasPressedThisFrame)
324
+
325
+ {
326
+
327
+ // 反応があれば右シフト隣のバックスラッシュ
328
+
329
+ Debug.Log("Backslash");
330
+
331
+ }
332
+
333
+ else
334
+
335
+ {
336
+
337
+ // 反応がなければバックスペース隣の円記号
338
+
339
+ Debug.Log("Yen");
340
+
341
+ }
342
+
343
+ }
344
+
345
+ else
346
+
347
+ {
348
+
349
+ // バックスラッシュ以外はそのまま表示
350
+
351
+ Debug.Log(key);
352
+
353
+ }
354
+
355
+
356
+
357
+ break;
358
+
359
+ }
360
+
361
+ }
362
+
363
+ }
364
+
365
+ }
366
+
367
+ }
368
+
369
+ ```

1

追加調査の結果を追記

2020/10/21 01:44

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -75,3 +75,175 @@
75
75
 
76
76
 
77
77
  私の場合は区別できたように見えたのですが、はたしてどの環境でも通用するのかはすごく不確かです。すみません...
78
+
79
+
80
+
81
+ ##追記
82
+
83
+
84
+
85
+ 下記のようにもっと詳しい情報を出力させるようにしたバージョンを試してみたところ...
86
+
87
+
88
+
89
+ ```C#
90
+
91
+ using UnityEngine;
92
+
93
+
94
+
95
+ public class BackslashTest2 : MonoBehaviour
96
+
97
+ {
98
+
99
+ private bool needsCheckBackslash;
100
+
101
+
102
+
103
+ private void Update()
104
+
105
+ {
106
+
107
+ if (Input.GetKeyDown(KeyCode.Backslash))
108
+
109
+ {
110
+
111
+ this.needsCheckBackslash = true;
112
+
113
+ Debug.Log($"Update frame: {Time.frameCount}");
114
+
115
+ }
116
+
117
+ }
118
+
119
+
120
+
121
+ private void OnGUI()
122
+
123
+ {
124
+
125
+ if (this.needsCheckBackslash)
126
+
127
+ {
128
+
129
+ var e = Event.current;
130
+
131
+ Debug.Log($"OnGUI frame: {Time.frameCount}, Event type: {e.type}");
132
+
133
+ if (e.isKey)
134
+
135
+ {
136
+
137
+ if (e.functionKey)
138
+
139
+ {
140
+
141
+ Debug.Log("Backslash");
142
+
143
+ }
144
+
145
+ else
146
+
147
+ {
148
+
149
+ Debug.Log("Yen");
150
+
151
+ }
152
+
153
+
154
+
155
+ this.needsCheckBackslash = false;
156
+
157
+ }
158
+
159
+ }
160
+
161
+ }
162
+
163
+ }
164
+
165
+ ```
166
+
167
+
168
+
169
+ ご質問者さんのご指摘通り、`KeyDown`を見逃して`KeyUp`時点で反応していたようでした。
170
+
171
+
172
+
173
+ ![図](480e107603125fe08b85850034ca49be.png)
174
+
175
+
176
+
177
+ どうやら「`Update`でキーダウンがあったかを判断し、その後の`OnGUI`で円記号かバックスラッシュか判定する」というのでは遅すぎたようです。全部`OnGUI`内で完結させるよりないかもしれません。
178
+
179
+
180
+
181
+ ```C#
182
+
183
+ using UnityEngine;
184
+
185
+
186
+
187
+ public class BackslashTest3 : MonoBehaviour
188
+
189
+ {
190
+
191
+ private void OnGUI()
192
+
193
+ {
194
+
195
+ var e = Event.current;
196
+
197
+ if (e.type == EventType.KeyDown)
198
+
199
+ {
200
+
201
+ // https://docs.unity3d.com/ja/current/ScriptReference/EventType.KeyDown.html によると
202
+
203
+ // キーを押した時にはkeyCodeを持つイベントとcharacterを持つイベントが別々に発行されるらしい
204
+
205
+ if (e.keyCode == KeyCode.None)
206
+
207
+ {
208
+
209
+ Debug.Log($"Character: [{e.character}]");
210
+
211
+ }
212
+
213
+ else if (e.keyCode == KeyCode.Backslash)
214
+
215
+ {
216
+
217
+ if (e.functionKey)
218
+
219
+ {
220
+
221
+ Debug.Log("Backslash");
222
+
223
+ }
224
+
225
+ else
226
+
227
+ {
228
+
229
+ Debug.Log("Yen");
230
+
231
+ }
232
+
233
+ }
234
+
235
+ else
236
+
237
+ {
238
+
239
+ Debug.Log(e.keyCode);
240
+
241
+ }
242
+
243
+ }
244
+
245
+ }
246
+
247
+ }
248
+
249
+ ```