質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

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

Q&A

解決済

2回答

7153閲覧

Unity Enterキーにのみ反応するInputFieldを作りたい。

silver_night

総合スコア34

Unity

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

0グッド

0クリップ

投稿2020/05/01 11:37

前提・実現したいこと

Enterキーにのみ反応するInputFieldを作っています。
OnEndEditに関数を入れればEnterキーを押した際に反応することは知っているのですが、フォーカスが外れても反応してしまうため、Enterキーにのみ反応するInputFieldを作りたいと思い、関数を自作しました。
InputFieldにフォーカスしているか調べる機能を実装中に問題が発生しました。

発生している問題

InputFieldにフォーカスしているか確認するメソッドを入れたところ、Enterキーを押しても関数が呼ばれなくなりました。
調べてみたところ、Input.anyKeyDownメソッドにEnterKeyだけが反応しませんでした。

該当のソースコード

c#

1 2//途中までうまく行ったコード 3 4using System.Collections; 5using System.Collections.Generic; 6using UnityEngine; 7using UnityEngine.UI; 8 9public class TestScript : MonoBehaviour 10{ 11 public GameObject inputField_test; 12 13 void Update() 14 { 15 if (Input.anyKeyDown) //何かボタンが押されたら 16 { 17 Debug.Log("called1"); 18 IfPushEnter(); 19 } 20 } 21 22 //Enterが押されたら反応するメソッド 23 void IfPushEnter() 24 { 25 if (Input.GetKey(KeyCode.Return)) 26 { 27 Debug.Log("called2"); ←ここまで呼ばれます。 28 } 29 } 30} 31

c#

1 2//うまくいかなかったコード 3 4using System.Collections; 5using System.Collections.Generic; 6using UnityEngine; 7using UnityEngine.UI; 8 9public class TestScript : MonoBehaviour 10{ 11 public GameObject inputField_test; 12 13 14 void Update() 15 { 16 bool isForcus = inputField_test.GetComponent<InputField>().isFocused; 17 18 if(isForcus == true) 19 { 20 Debug.Log("called0"); ←ここは呼ばれます。 21 22 if (Input.anyKeyDown) //何かボタンが押されたら 23 { 24 Debug.Log("called1"); ←Enter以外のキーで呼ばれます。 25 IfPushEnter(); 26 } 27 } 28 } 29 30 //Enterが押されたら反応するメソッド 31 void IfPushEnter() 32 { 33 if (Input.GetKey(KeyCode.Return)) 34 { 35 Debug.Log("called2"); ←呼ばれません。 36 } 37 } 38 39 40} 41

なぜEnterキーにだけ反応しなくなったのでしょうか。
また、Enterキーにのみ反応するInputFieldの作り方がありましたらご教示ください。

補足情報(FW/ツールのバージョンなど)

Unity 2018.3.1f1 personal
VisualStudio 2017 community

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

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

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

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

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

guest

回答2

0

ベストアンサー

多分anyKeyDownがEnterキーだけ無視してしまっているというわけではなくて、別の理由があるんじゃないですかね?

どうやらisFocusedの状態更新はOnUpdateSelectedのタイミングで処理されているようで、これはおそらく「イベント関数の実行順序 - Unity マニュアル」の図の中の「Input events」のセクションにあるんじゃないかと思います。
これはUpdateよりも早いタイミングですので、つまりインプットフィールドにフォーカスが当たっている状態でEnterキーが押されたとすると...

  1. インプットフィールドのOnUpdateSelectedが処理される。このタイミングでEnterキーの入力が検知され、フィールドへの入力が終了したと判定されてisFocusedfalseに変わる。
  2. TestScriptUpdateが処理される。このフレームでEnterキーが押されたためInput.anyKeyDownInput.GetKey(KeyCode.Return)trueになっているだろうが、そもそもそれ以前にisFocusedfalseに変わってしまっているので処理が行われない。

というような状況になっているんじゃないでしょうか。

下記のように、判定に1フレーム猶予を設けるというのはどうでしょう。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class TestScript : MonoBehaviour 7{ 8 public GameObject inputField_test; 9 10 private bool previousFocusState; 11 12 void Update() 13 { 14 bool isForcus = inputField_test.GetComponent<InputField>().isFocused; 15 16 // 現在のフレームに加えて、前のフレームでフォーカスが当たっていた場合にも処理を行う 17 if (isForcus || previousFocusState) 18 { 19 Debug.Log("called0"); 20 21 if (Input.anyKeyDown) 22 { 23 Debug.Log("called1"); 24 IfPushEnter(); 25 } 26 } 27 28 // 次のフレームに備えて現在のフォーカス状態を覚えておく 29 previousFocusState = isForcus; 30 } 31 32 void IfPushEnter() 33 { 34 if (Input.GetKey(KeyCode.Return)) 35 { 36 Debug.Log("called2"); 37 } 38 } 39}

あるいはもっとシンプルに、ご質問者さんは最初onEndEditを試されたご様子ですが、そこの中でEnterキー入力の有無を判定するのではいけないでしょうか?

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class TestScript : MonoBehaviour 7{ 8 public GameObject inputField_test; 9 10 void Start() 11 { 12 inputField_test.GetComponent<InputField>().onEndEdit.AddListener(IfPushEnter); 13 } 14 15 void IfPushEnter(string _) 16 { 17 if (Input.GetKey(KeyCode.Return)) 18 { 19 Debug.Log("called2"); 20 } 21 } 22}

投稿2020/05/01 21:25

Bongo

総合スコア10807

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

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

silver_night

2020/05/02 01:57

ありがとうございます! 2番目の方法でうまく行きました! こうすればよかったんですね。少し難しく考えすぎていたみたいです。 大変助かりました、ありがとうございました。
guest

0

投稿2020/05/01 12:02

y_waiwai

総合スコア87774

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

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

silver_night

2020/05/02 01:55

回答ありがとうごさいます。 読ませていただいたのですが、残念ながらこちらのサイトではヒントは見つかりませんでしたが、input関数の理解が深まりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問