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

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

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

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

Unity

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

Q&A

解決済

1回答

752閲覧

Unityでキー入力が共有されている場合に、切り離して入力を得る方法

kaz2zak

総合スコア36

C#

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

Unity

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

0グッド

0クリップ

投稿2018/04/21 08:49

キー入力が共有されている場合の受け取りについて困っています。
具体的に言うと、以下のように移動とズームの入力を設定したとします。
移動:矢印キー
ズームイン:キーボードのQ + 上矢印キー
ズームアウト:キーボードQ + 下矢印キー

この場合に、ズームイン・アウトをしたく"Q + ↑"をしても、移動の処理が優先されて動いてしまいます。
このようにキー入力が被った際に、それぞれ切り離して処理をするにはどうしたら良いのでしょうか。

キーボードがいっぱいあるから使わなければ良いと思うかもしれませんが、実装はGearVRのコントローラーを考えています。
コントローラーは元々の入力数が少なく、トリガー+タッチパッド、タッチパッドのみなど、一部共有をしながら入力を設定したいのですが、上の理由で共有している部分の動きが理想とずれてしまいます。

C#

1 void Update() 2 { 3 4 //ズームアウト 5 if (Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.DownArrow)) 6 { 7 var diff = currentTargetCenter - transform.position; 8 float diffR = diff.magnitude; 9 10 if (diffR < maxDistance) 11 { 12 transform.position = Vector3.MoveTowards(transform.position, currentTargetCenter, -zoomSpeed * Time.deltaTime); 13 } 14 } 15 //ズームイン 16 if (Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.UpArrow)) 17 { 18 var diff = currentTargetCenter - transform.position; 19 float diffR = diff.magnitude; 20 21 if (diffR > minDistance) 22 { 23 transform.position = Vector3.MoveTowards(transform.position, currentTargetCenter, zoomSpeed * Time.deltaTime); 24 } 25 } 26 27 28 UpdateCurrentTarget(); 29 30 31 //y軸方向 32 if (Input.GetKey(KeyCode.UpArrow)) 33 { 34 mouse.y += spinSpeed / 60; 35 } 36 if (Input.GetKey(KeyCode.DownArrow)) 37 { 38 mouse.y -= spinSpeed / 60; 39 } 40 mouse.y = Mathf.Clamp(mouse.y, 0.1f, 0.9f); 41 42 43 //x軸方向 44 if (Input.GetKey(KeyCode.RightArrow)) 45 { 46 mouse.x += spinSpeed / 60; 47 } 48 if (Input.GetKey(KeyCode.LeftArrow)) 49 { 50 mouse.x -= spinSpeed / 60; 51 } 52 53 54 //球体座標内 移動処理 55 var diffRoatate = transform.position - currentTargetCenter; 56 float distance = diffRoatate.magnitude; 57 58 pos.x = distance * Mathf.Sin(mouse.y * Mathf.PI) * Mathf.Cos(mouse.x * Mathf.PI); 59 pos.y = -distance * Mathf.Cos(mouse.y * Mathf.PI); 60 pos.z = -distance * Mathf.Sin(mouse.y * Mathf.PI) * Mathf.Sin(mouse.x * Mathf.PI); 61 62 63 transform.position = pos + currentTargetCenter; 64 65 transform.LookAt(currentTargetCenter); 66 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

cs

1 //y軸方向 2 if (!Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.UpArrow)) 3 { 4 mouse.y += spinSpeed / 60; 5 } 6 if (!Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.DownArrow)) 7 { 8 mouse.y -= spinSpeed / 60; 9 } 10 mouse.y = Mathf.Clamp(mouse.y, 0.1f, 0.9f); 11 12 13 //x軸方向 14 if (!Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.RightArrow)) 15 { 16 mouse.x += spinSpeed / 60; 17 } 18 if (!Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.LeftArrow)) 19 { 20 mouse.x -= spinSpeed / 60; 21 } 22

移動処理はQが押されていなかったら、とするだけでいい気がします。

投稿2018/04/21 08:56

SAM-tak

総合スコア199

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

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

kaz2zak

2018/04/21 09:18

ありがとうございます! VRの入力でも上手くできました! "!"で入力されていなかったらにすればよかったんですね! 目から鱗でした!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問