🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2762閲覧

Unityでのキー入力検知について

Tiida7

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/02/11 05:37

タイピングゲームを作りたいと思い、キー入力についていろいろ調べました。
OnGUI()を使って検知することが分かりました。
しかし、実際に下記のようにコードを打って、試してみると、
検知はできたものの、2文字続けて検知されてしまいます。

例えば、Aと入力すると、テキストオブジェクトの文字が
AAとなってしまいます。

これをAと入力したらAとなるようにしたいのですが、
どうすればよいのでしょうか?

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6 7public class Test : MonoBehaviour 8{ 9 public Text text; 10 string InputKey; 11 string Word; 12 char c; 13 14 // Start is called before the first frame update 15 void Start() 16 { 17 18 } 19 20 // Update is called once per frame 21 void Update() 22 { 23 text.text = Word; 24 } 25 26 void OnGUI() 27 { 28 Event e = Event.current; 29 if (e.isKey) 30 { 31 Debug.Log("Detected key code: " + e.keyCode); 32 if (e.keyCode.ToString() != "None") 33 { 34 InputKey = e.keyCode.ToString(); 35 c = InputKey[0]; 36 Word += c; 37 } 38 } 39 } 40}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fiveHundred

2021/02/11 05:39

OnGUI()は古い機能で、今から使うのはおすすめできません。
guest

回答1

0

ベストアンサー

OnGUI()は古い機能で、今から使うのはおすすめできません。

と即座に答えたけれども、このような過去の質問が見つかって、これを考慮すると良さそうな代用案が思いつかなかったので、その前提で回答します。
(OnGUI()が古いというのは確かなので、もし他にいい方法がある人は、その内容を回答してほしいです)

こちらによれば、

Used in EventType.KeyDown and EventType.KeyUp events; this returns KeyCode value that matches the physical keyboard key. Use this for handling cursor keys, function keys etc.

とあるので、EventType.KeyDownとEventType.KeyUpの両方で実行されているため、二重に入力されているのだと思います。

EventType.KeyUpの影響を受けないEvent.characterを使うか、Event.typeでの判定を追加してください。


追記:

以下にようにstring型に変換した上で格納しているつもりなのですが、
格納されておらず、デバッグログで表示しても空になっています。

こちらで確認してみたところ、「a」を押下すると、ヌル文字→aの順に出力されているみたいでした。
なぜヌル文字が出ているのかが分かりませんが、以下のようにヌル文字を無視することで表示はされるようになるので、これで試してみてください。

C#

1 void OnGUI() 2 { 3 Event e = Event.current; 4 if (e.type == EventType.KeyDown && e.character != '\0') 5 { 6 Debug.Log("Detected key code: " + e.character); 7 Word += e.character; 8 } 9 }

投稿2021/02/11 06:25

編集2021/02/11 08:45
fiveHundred

総合スコア10152

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tiida7

2021/02/11 07:39

ご回答ありがとうございます。 そうです。まさにその記事を見て、高速タイプに対応するという意味で使いました。 (その他の方法は知らないですが、ある程度、早いタイプに対応できない可能性が懸念されるので。) Event.characterを使うことで、2文字続けて入力される問題は解消されましたが、 なぜか、string型の変数に格納できなくなりました。 なぜでしょうか?(ToString()を末尾につけても同様)
fiveHundred

2021/02/11 07:58

Event.characterはstring型ではなく、char型です。
Tiida7

2021/02/11 08:08

char型であるとは理解しています。 以下にようにstring型に変換した上で格納しているつもりなのですが、 格納されておらず、デバッグログで表示しても空になっています。 Word += e.character.ToString();
fiveHundred

2021/02/11 08:45

回答に追記しました。
Tiida7

2021/02/11 09:00

ご回答ありがとうございます。 nullが悪さしていることはなんとなく予想していたのですが、 普通にif文でnullと書いて式を書くとエラーとなってしまい困っていました。 char型の場合は、'\0'でnullを表現するんですね。勉強になりました。 無事、期待していた動作ができました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問