前提・実現したいこと
unity、c#でやっています。
例えばGキーを押してから1秒間Tキーが入力できなくなる、という風にするにはどうすればいいでしょうか?
自分で調べてみた範囲ではキー入力をDisableにするような方法がわからなかったのでこちらで質問させていただきます。
サンプルのコードなどいただけるとありがたいです。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
ソースコード
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
Gキーが押されたときに1秒後の時刻を求めて、現在時刻がその時刻を過ぎるまでTキーやジョイスティックの読み取りを行わないというのはどうでしょうか。
C#
1 // Gキーが押されたら... 2 if (Input.GetKeyDown(KeyCode.G)) 3 { 4 // 現在から1秒後の時刻を覚えておく 5 this.timeToEnableInputs = Time.time + 1.0f; 6 Debug.Log("G"); 7 } 8 9 // 現在時刻が覚えておいた時刻に満たなければ、入力読み取りをスキップするようにする 10 // 時間によって無効化したい入力読み取りは、このifブロックの中に入れる 11 if (Time.time >= this.timeToEnableInputs) 12 { 13 if (Input.GetKeyDown(KeyCode.T)) 14 { 15 Debug.Log("T"); 16 } 17 18 var stick = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical")); 19 if (stick.sqrMagnitude > 0.01f) 20 { 21 Debug.Log(stick); 22 } 23 }
#追記
そのようなケースはMMashiroさんの方針がおすすめですね。個々のスクリプトが直接Inputクラスから入力情報を得るのではなく、Inputクラスと似たような使い勝手で入力情報を取得できる入力仲介クラスを用意して、他のスクリプトはInputの代わりにそこから入力を取得するよう書き換えてはいかがでしょう。
イメージをつかむためのシンプルな例ですと、たとえば下記のようなstaticクラスを作り...
C#
1using UnityEngine; 2 3public static class CustomInput 4{ 5 private static float timeToEnableInputs; 6 7 public static void DisableInputs(float time) 8 { 9 timeToEnableInputs = Time.time + time; 10 } 11 12 public static float GetAxis(string axisName) 13 { 14 return Time.time >= timeToEnableInputs ? Input.GetAxis(axisName) : 0.0f; 15 } 16 17 public static bool GetKeyDown(KeyCode key) 18 { 19 return (Time.time >= timeToEnableInputs) && Input.GetKeyDown(key); 20 } 21}
他のスクリプトはInput
の代わりにCustomInput
を使うというルールを定めれば、CustomInput
の作り方次第でさまざまな独自の振る舞いをさせることができるはずです。
下記CustomInputTest
の場合、最初に例示しましたコードと異なり、こちらのクラスでは時刻の判定が記述されていない点にご注目ください。時刻の判定はCustomInput
に任されており、CustomInput.DisableInputs
で設定した時間が経過するまで常にCustomInput.GetKeyDown
はfalse
、CustomInput.GetAxis
は0.0f
となります。
C#
1using UnityEngine; 2 3public class CustomInputTest : MonoBehaviour 4{ 5 private void Update() 6 { 7 if (CustomInput.GetKeyDown(KeyCode.G)) 8 { 9 CustomInput.DisableInputs(1.0f); 10 Debug.Log("G"); 11 } 12 13 if (CustomInput.GetKeyDown(KeyCode.T)) 14 { 15 Debug.Log("T"); 16 } 17 18 var stick = new Vector2(CustomInput.GetAxis("Horizontal"), CustomInput.GetAxis("Vertical")); 19 if (stick.sqrMagnitude > 0.01f) 20 { 21 Debug.Log(stick); 22 } 23 } 24}
もっと複雑な振る舞いをさせたい場合、MMashiroさんの言及されているシングルトン方式が役に立つかもしれません。シングルトン方式ではシーン上にゲームオブジェクトを一つだけ作成し、そこでUpdate
やコルーチンを走らせることも可能になるでしょう。
ちょっといい例が思いつきませんが、少し複雑な時間的制御を必要とする処理...文字入力時のキーリピートのような、キーダウン直後に1回true
、一呼吸置いてtrue
が連打される...なんて挙動も実装できそうな気がします。
投稿2018/12/04 21:01
編集2018/12/05 12:18総合スコア10807
0
Unity側にはキーボード入力の受付を一時的に止めるということは基本的にできません
また入力処理を複数スクリプトから行うというのはあまりよくない設計です
今回のような問題も起きやすい上、
規模が大きくなってきたときに複数個所に入力処理があると追跡が困難になる等々拡張性に欠ける為です
しかしそういった仕様にする場合はInputManager的なクラスを用意し、
両クラスから単一の変数にアクセス可能な仕組みを用意する必要があります。
そういった仕組みの例
追記
海外のフォーラムでstatic変数を用いた例がありました、参考にしてみてください
https://answers.unity.com/questions/1275232/disable-all-inputs.html
投稿2018/12/05 05:23
編集2018/12/05 05:29総合スコア2378
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/05 02:30 編集
2018/12/05 02:31
2018/12/05 03:36
2018/12/05 04:47
2018/12/06 03:03
2018/12/06 03:27