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

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

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

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

Unity

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

Q&A

解決済

1回答

3148閲覧

Unityでキーコンフィグ・短押し・離しを同時に実装したい

OROCHI_TUNGUS

総合スコア31

C#

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

Unity

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

0グッド

0クリップ

投稿2017/08/01 17:00

こんにちは。現在Unityを使いキーコンフィグを実装し、コンフィグしたキーで短押しと離しを検知したいと考え以下のようなクラスを作りました

C#

1// コンフィグしたキーを検出するクラス 2public class ControllerManager : SingletonMonoBehaviour<ControllerManager> 3{ 4 public bool Search; 5 public bool SearchUp; 6 7 // PlayerPrefsにどのボタンがSearchというデータが入ってると思ってください 8 search_controller = PlayerPrefs.GetString("Search_Controller"); 9 10 void Start () 11 { 12 if (this != Instance) 13 { 14 Destroy(this); 15 return; 16 } 17 18 DontDestroyOnLoad(gameObject); 19 this.UpdateAsObservable().Subscribe(_ => 20 { 21 Array k = Enum.GetValues(typeof(KeyCode)); 22 for (int i = 0; i < k.Length; i++) 23 { 24 // 入力キー取得 25 if (Input.GetKeyDown((KeyCode)k.GetValue(i))) 26 { 27 GetKeyInput(i,k); 28 } 29 // 離した瞬間取得 30 else if(Input.GetKeyUp((KeyCode)k.GetValue(i))) 31 { 32 GetKeyUp(i, k); 33 } 34 // 非入力時解除 35 else 36 { 37 GetKeyNotInput(i, k); 38 } 39 } 40 } 41 } 42 43 public void GetKeyInput(int i,Array k) 44 { 45 if (k.GetValue(i).ToString().IndexOf("Joystick1") >= 0 && k.GetValue(i).ToString().IndexOf("Mouse") < 0) 46 { 47 // サーチ取得 48 if (k.GetValue(i).ToString() == search_controller) 49 { 50 Search = true; 51 SearchUp = false; 52 } 53 } 54 } 55 56 public void GetKeyUp(int i, Array k) 57 { 58 if (k.GetValue(i).ToString().IndexOf("Joystick1") >= 0 && k.GetValue(i).ToString().IndexOf("Mouse") < 0) 59 { 60 // サーチ取得 61 if (k.GetValue(i).ToString() == search_controller) 62 { 63 SearchUp = true; 64 } 65 } 66 } 67 68 public void GetKeyNotInput(int i, Array k) 69 { 70 if (k.GetValue(i).ToString().IndexOf("Joystick1") >= 0 && k.GetValue(i).ToString().IndexOf("Mouse") < 0) 71 { 72 // サーチ取得 73 if (k.GetValue(i).ToString() == search_controller) 74 { 75 Search = false; 76 } 77 } 78 } 79}

使うときは任意のUpdateで以下の関数を呼んで入力を検出します

C#

1public bool GetSearchInput() 2{ 3 4 if (ControllerManager.Instance.Search) 5 { 6 return true; 7 } 8 9 return false; 10} 11 12

ところが、この方式だとSearchを押したときにControllerManagerがSearchが押されている間ずっとtrueを返してしまいます
押した瞬間だけtrueを返させるにはどうしたらいいでしょうか?
よろしければご回答お願いします

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

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

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

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

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

sakura_hana

2017/08/02 06:05

Debug.Logを各所にしかけて「どのメソッドに入っているのか」「k.GetValue(i)が何になっているか」を確認してください。(恐らくGetKeyNotInput内のif文に合致しないでいるものと思いますが)
OROCHI_TUNGUS

2017/08/02 13:25

調べた結果、GetSearchInputがSearchがTrueになったらボタンを離すまで延々とTrueを返し続けていました。
guest

回答1

0

自己解決

GetSearchInputがSearchがTrueになったらボタンを離すまで延々とTrueを返し続けていました
なので以下の関数をControllerManagerに追加しました

C#

1private IEnumerator SearchButtonStopper() 2{ 3 yield return new WaitForEndOfFrame(); 4 Search = false; 5}

そしてGetKeyInputを以下のように変更しました

C#

1public void GetKeyInput(int i,Array k) 2 { 3 if (k.GetValue(i).ToString().IndexOf("Joystick1") >= 0 && k.GetValue(i).ToString().IndexOf("Mouse") < 0) 4 { 5 // サーチ取得 6 if (k.GetValue(i).ToString() == search_controller) 7 { 8 Search = true; 9 SearchUp = false; 10 StartCoroutine(SearchButtonStopper()); 11 } 12 } 13 } 14

これでSearchがtrueになった瞬間だけTrueを返すことができるようになりました

投稿2017/08/02 13:29

OROCHI_TUNGUS

総合スコア31

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問