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

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

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

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

Q&A

解決済

1回答

14065閲覧

unityのInput.Getkeyの一時的な無効化

wakitaka

総合スコア12

Unity

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

0グッド

3クリップ

投稿2019/08/06 11:45

編集2019/08/06 11:58

unity初心者のものです。
現在個人でゲームを製作しているのですが、ゲームのギミックの一つで障害物にぶつかると一定時間(5秒ほど)スペースキーの取得を無効にするような機能を探しています。

衝突の取得はoncollisionenterで良いのですが、スペースキーの取得を無効にする書き方が分かりません。

初心者質問ですみません。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Unityに組み込まれたInput.GetKeyを無効化する方法はありません。
ですが、Input.GetKeyを代行するようなプロクシクラスを作ることによって恐らく要求は満たせるでしょう。

C#

1using UnityEngine; 2using System.Collections.Generic; 3public class InputProxy:MonoBehaviour 4{ 5 public static InputProxy Instance{get; private set;} 6 public List<KeyCode> disabledKeys = new List<KeyCode>(); 7 void Start() 8 { 9 Instance = this; 10 } 11 void OnDestroy() 12 { 13 Instance = null; 14 } 15 public bool GetKey(KeyCode key) 16 { 17 return !disabledKeys.Contains(key)&& Input.GetKey(key); 18 } 19}

このようなクラスを作成し、このスクリプトをアタッチしたGameObjectをシーンに配置します。

この状態で、
OnCollisionEnterでInputProxy.Instance.disabledKeys.Add(KeyCode.Space)を行い、
一定時間後にRemoveを行うような処理をすれば一定時間だけSpaceキーを無効化することができます。
その上でInput.GetKeyの代わりにInputProxy.Instance.GetKeyを用いれば問題ないでしょう。

追記

ですが、そもそも本当にあなたがやりたいのはスペースキーを一定時間機能不全に陥らせることなのでしょうか?
恐らくはスペースキーに割り当てられたジャンプなどを無効化したいのだと思います。
今後のバグ軽減のためにも、Input.GetKey(KeyCode.Space)を呼び出している側のスクリプトで無効化判定を行ったほうがより良いと思います。

追記
Input.GetKeyの呼び出し元での管理とは具体的にはこんな感じのものです。

C#

1 2 3sing UnityEngine; 4using System.Collections.Generic; 5public class PlayerActionManager:MonoBehaviour 6{ 7 8 List<PlayerAction> disabledActions = new List<PlayerAction>(); 9 10 11 void OnCollisionEnter(Collision collision) 12 { 13 StartCoroutine(DisableAction(PlayerAction.Jump,3f)); 14 } 15 16 IEnumerator DisableAction(PlayerAction action,float duration) 17 { 18 disabledActions.Add(action); 19 yield return new WaitForSeconds(duration); 20 disabledActions.Remove(action); 21 } 22 void Update() 23 { 24 if(!disabledActions.Contains(PlayerAction.Jump) && Input.GetKeyDown(KeyCode.Space)) 25 { 26 Jump(); 27 } 28 } 29 30 void Jump() 31 { 32 //....... 33 } 34} 35public enum PlayerAction 36{ 37 Jump, 38 Crouch, 39 Punch 40}

投稿2019/08/06 12:14

編集2019/08/06 12:44
Ram.Type-0

総合スコア424

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

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

wakitaka

2019/08/06 12:27

おっしゃる通りです、割り当てられた機能を無効化したいと考えております… すみません、Input.GetKey(KeyCode.Space)を呼び出している側のスクリプトで無効化判定を行うとは、具体的にはどのようにすればよろしいでしょうか?
Ram.Type-0

2019/08/06 12:46

具体例を追記しておきました。 このように、できる限り本質を忠実に再現したようなプログラム構造がバグの少なく、拡張性の高いコードに繋がります。
wakitaka

2019/08/06 13:08

本当にご丁寧にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問