ジョイパッドのボタンの入力を取得する
2024/05/21
Godot Engine version 4.2 stable
作成者:ダイギイン(アクシオン管理人)

2024/05/21 追記

当記事5項「インプットマップにゲーム実行中からボタンを割り当てる」において、
_inputメソッド内、InputEventクラスの"_event"変数について追記を行いました。
詳しくはこちらから。

はじめに

インプットマップは作ったけど、キーコンフィグを作りたい。
とりわけジョイパッドの入力を取得したいとき、どうすれば良いでしょうか?

そこで、ジョイパッドの入力を取得する方法などを調べてみました。
(なお、この記事だけでキーコンフィグはできないと思われます。予めご了承ください。)

なお、"XInput"仕様のジョイパッドを接続してください。
最近売っているものは大抵が"XInput"仕様なので問題ないかと思います。

WindowsXPぐらいの頃のジョイパッド(Microsoft SideWinderなど)は、
"Direct Input"という古い仕様なので、当記事では割愛します。

以後、ジョイパッドが接続している前提で記事を進めます。


目次


1.準備

新規プロジェクトを作ります。
ウィンドウサイズは小さくて構いません。
ボタンを一つ配置します。
大まかに、次の画像(fig.1)のようにします。


fig.1 プロジェクトの準備
※ファイルシステム欄にあるスクリプト群は追って紹介します。


2.ジョイパッドの情報を取得する

最初に、ボタンが押されたときに接続しているジョイパッドの情報を取得してみます。
次のスクリプト(script.1)を作成し、"MainScene"ノード(ルートノード)にアタッチします。

※ sample_sceipt1.gd

script.1 ジョイパッドの情報を取得する

fig.2 ボタンを押した結果


script.1 を順番に解説します。

まず、_process(_delta)メソッドでジョイパッドが接続されているかを常にチェック(ポーリング)します。
<Array> get_connected_joypads()メソッド

クラス名 : Input

接続されているジョイパッドのインデックスを配列で返します。

次に、ウィンドウのボタンが押された場合、_on_set_button_pressed()メソッドで情報を取得します。
  1. ジョイパッドが検出できていないときは処理を抜けます
  2. get_joy_infoメソッドで最初に検知したジョイパッドについての情報を取得します。取得した情報は辞書型です。
  3. ジョイパッドのインデックスを、joypad_info辞書型に"xinput_index"を指定して取得します。
<Dictionary> get_joy_info()メソッド

クラス名 : Input

指定したジョイパッドのインデックスについての情報を辞書型で返します。
※ Windows環境では xinput_index 項目のみ取得できます。


3.ジョイパッドの識別名を取得する

次に、接続したジョイパットがGodotでの識別名を取得してみます。
"sample_sceipt1.gd" (script.1)の"_on_button_pressed()"メソッドの中身を、
次のスクリプト(script.2)のように変更します。

※ sample_sceipt2.gd("sample_sceipt1.gd" の一部を変更)

script.2 ジョイパッドの識別名を取得する

fig.3 ボタンを押した結果
(結果は XInput のゲームパッドであると識別されています)

<String> get_joy_name()メソッド

クラス名 : Input

指定したジョイパッドのインデックスについての識別名を文字列型で返します。


4.ジョイパッドの指定のボタンが押されたことを知る

次のスクリプト(script.3)を作成し、"MainScene"ノードにアタッチします。

※ sample_sceipt3.gd

script.3 ジョイパッドの識別名を取得する

作成したら実行して、ジョイパッドのAボタンを押してみます。


fig.4 ジョイパッドのAボタンを押した結果
(一度だけ押したつもりですが、複数回反応しました。)

何度か試しましたが、試すたびに反応する回数が変わってしまいました。(fig.4)
「1回だけ」反応させるには工夫が必要なようです。
次項でやってみます。


5.インプットマップにゲーム実行中からボタンを割り当てる

「プロジェクト設定」の「インプットマップ」に「Jump」を設定します。(fig.5)
まだボタンは割り当てません。


fig.5 インプットマップの設定

"SetButton" のインスペクターからトグルモードをオンにします。(fig.6)

fig.6 ボタンの設定
"MainScene"にアタッチするスクリプトを作成します。(script.4)
※ sample_sceipt4.gd

script.4 インプットマップにゲーム実行中からボタンを割り当てる

使い方は次の通りです。
  1. "SetButton"をクリックしてON状態にします
  2. ジョイパッドのボタンを押します
  3. アクションマップに登録され、出力ウィンドウに押されたボタンのIDを表示します
  4. "SetButton"をクリックしてOFF状態にします
  5. 先ほどと違うボタンを押します
  6. 出力ウィンドウに新しい表示は出ません
  7. アクションマップに登録したジョイパッドのボタンを押します
  8. 出力ウィンドウに押されたボタンのIDが表示されます
実行結果は次のようになります。(fig.7)

fig.7 実行中にインプットマップへボタンを登録する
※ "Setted button from Jump"メッセージは複数回表示される場合があります。

主なメソッドについて紹介します。
<bool> is_anything_pressed() メソッド

クラス名 : Input

何かの入力があった場合に true を返します。

<void> action_add_event ( StringName action, InputEvent event )メソッド

クラス名 : InputMap

引数1 : インプットマップに存在するアクション名
引数2 : インプットイベント)

入力したものをインプットマップに存在するアクション名に割り当てます

<InputEvent[]> action_get_events ( StringName action ) メソッド

クラス名 : Input

引数 : インプットマップに存在するアクション名

アクション名に割り当てたボタンが押されたときに InputEvent配列に格納します

<bool> is_action_just_pressed ( StringName action, bool exact_match=false ) メソッド

クラス名 : Input

引数1 : インプットマップに存在するアクション名
引数2 : Exct_match が false の場合、InputEventKey および
InputEventMouseButton イベントの追加入力モディファイアと、
InputEventJoypadMotion イベントの方向は無視されます

アクション名に割り当てたボタンが押されたときに true を返します

追記:"_event"変数について

"_event"変数は、入力の種類によって変数のメンバが変わります。
当記事の script.4 では「ジョイパッドのボタン」の入力を前提にしています。
この変数のメンバを知るには、スクリプトにブレークポイントを設置し、
実行時にインスペクターで確認するのが手っ取り早いと思われます。

以上


6.おわりに

今回はここまでとなります。
ゲーム中のキーコンフィグを作成するにはもう少し調べる必要がありそうです。

最後までお読みいただきありがとうございました。


7.参考資料

この記事は下記の記事を参考にしました。
この場を借りてお礼申し上げます。

Godot Engine 4.2の日本語のドキュメント Other objects -> Input
https://docs.godotengine.org/ja/4.x/classes/class_input.html

Godot Engine 4.2の日本語のドキュメント Other objects -> InputMap
https://docs.godotengine.org/ja/4.x/classes/class_inputmap.html

ページトップ