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

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

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

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

Q&A

解決済

3回答

2559閲覧

Unity ゲームパッドの操作、キー押しっぱなしでも1回だけ反応させるには

nekonote

総合スコア23

Unity

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

0グッド

0クリップ

投稿2023/03/08 02:11

編集2023/03/08 02:31

ゲームパッドの十字キー(アナログのではない昔ながらの十字キーのほう)の上を「押した瞬間」のみ、trueになるif文を書きたいのです。
現状、以下のように記述しているのですが、
if (Input.GetAxisRaw("Vertical") == 1)
これだと、十字キーの上を押してている間ずっと、trueが返り続けます。

押されてないときから押した状態なった一回だけを取るにはどうしたいいでしょうか?

要は、通常のキーボード入力における
Input.GetKeyDown をやりたいのです。

一応、 if (Input.GetAxisRaw("Vertical") == 1) が一度trueになったら、フラグを立てて、上方向キーが解除されるまでは再びtrueにならない、という処理(以下)で解決はできています。

if (Input.GetAxisRaw("Vertical") == 1 && push==0) { push = 1; Debug.Log("●"); } if (Input.GetAxisRaw("Vertical") != 1 ) { push= 0; }

ただ、スマートでないというか。他のキーだとInput.GetKeyDownという、ただ一文の記述で済むので、もっと楽なやり方があるのか知りたいです。

あまり関係ないとは思いますが、ゲームパッドは、Xボックスのではなく、エレコムのパッドです。
よろしくお願いします。

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

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

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

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

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

guest

回答3

0

十字キーの入力は、ボタンではなくスティックと同じ「Axis」として入力されます。
これはUnityではなくコントローラ側の仕様です。
なのでAxisに対するAPIがGetAxisしかないInputManagerでは、どうやっても対応できません。
他の回答者やnekonoteさんがしているように自分でコードを書きフラグ管理して対応する必要があります。

もしくはInputSystemや、有料AssetのRewiredを使うとAxisに対してもUp、Down、Holdが設定できます。

投稿2023/03/08 06:13

編集2023/03/08 06:20
UnchFullburst

総合スコア663

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

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

nekonote

2023/03/08 08:49

要はキーボードの仕様とは同様に考えてはいけない、ということだったのですね。 それで完全に納得して進められます。 ありがとうございます。
guest

0

何をもって「スマート」とするのか次第ですが,
「フラグなり何なりでキーの状態履歴を記憶してどうのこうのする部分」だけを切り出しておけば,
とりあえずそれを使っている側のコードは「スマート」に見える可能性があるのかもしれません.

C#

1//キーの状態履歴を記憶してどうのこうのする部分を切り出したもの 2class KeyState 3{ 4 uint History = 0; //※まぁこんなにbit数いらないだろうけど 5 6 //「対象のキーが今押されているか否か」を引数に与えて更新 7 public KeyState UpdateHistory( bool KeyPressed ) 8 { 9 History = (History<<1) | Convert.ToUInt32(KeyPressed); 10 return this; 11 } 12 13 //今押されたのかどうかの判定(まともなメソッド名がわからん^^) 14 public bool IsNewPress(){ return (History & 0x3u) == 0x1u; } 15}

C#

1//使う場所の例 2//(※ここでは "KS" が↑のインスタンスなのだとして) 3if( KS.UpdateHistory( Input.GetAxisRaw("Vertical")>0 ).IsNewPress() ) //「スマート」と言えるか? 4{ 5 //押されてない状態から押された状態になったときの処理 6}

何ならキーの状態の取得処理も KeyState みたいなやつの中に入れてしまえば,使う場所の見た目がよりマシになるのかも?

投稿2023/03/08 05:13

編集2023/03/08 05:15
fana

総合スコア11656

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

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

fana

2023/03/08 05:13

Unityの事は全く知らないです^^
nekonote

2023/03/08 08:48

なるほど、まだスマートです ありがとうございます。
fana

2023/03/08 11:52

履歴が1bit(=フラグで前回値を覚える)な話は既出だったから あえて複数フレーム分の履歴を持てるようなサンプルを示したけども… 例えば「一定フレーム以上の長押し」みたいなのを判定したいなら,こんな形よりも素直に「連続で押されているフレーム数」なるカウンタにでもした方が素直だろう.(カウンタのオーバーフローに備える必要があるかもだけど)
guest

0

ベストアンサー

一例です。
チェックはしてませんので、不具合などあったら修正してください。

C#

1public class Foo : MonoBehaviour 2{ 3 // 前のフレームで押されているか 4 bool prevUpKey = false; 5 6 void Update() 7 { 8 bool isPushedUpKey = Input.GetAxisRaw("Vertical") == 1; 9 10 // 現在押されている、かつ、前のフレームで押されていない 11 if (isPushedUpKey && !prevUpKey) 12 { 13 // <行いたい処理をここに追加> 14 } 15 // キーの状態を更新 16 prevUpKey = isPushedUpKey; 17 } 18}

投稿2023/03/08 02:28

fiveHundred

総合スコア9801

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

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

nekonote

2023/03/08 08:48

入れ違いですいませんでした。 押されたかどうかを変数でチェックするというのが順当な手順なのですね。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問