2024/05/21 追記
当記事5項「インプットマップにゲーム実行中からボタンを割り当てる」において、_inputメソッド内、InputEventクラスの"_event"変数について追記を行いました。
詳しくはこちらから。
はじめに
インプットマップは作ったけど、キーコンフィグを作りたい。
とりわけジョイパッドの入力を取得したいとき、どうすれば良いでしょうか?
そこで、ジョイパッドの入力を取得する方法などを調べてみました。
(なお、この記事だけでキーコンフィグはできないと思われます。予めご了承ください。)
なお、"XInput"仕様のジョイパッドを接続してください。
最近売っているものは大抵が"XInput"仕様なので問題ないかと思います。
WindowsXPぐらいの頃のジョイパッド(Microsoft SideWinderなど)は、
"Direct Input"という古い仕様なので、当記事では割愛します。
以後、ジョイパッドが接続している前提で記事を進めます。
目次
1.準備
新規プロジェクトを作ります。
ウィンドウサイズは小さくて構いません。
ボタンを一つ配置します。
大まかに、次の画像(fig.1)のようにします。
2.ジョイパッドの情報を取得する
最初に、ボタンが押されたときに接続しているジョイパッドの情報を取得してみます。
次のスクリプト(script.1)を作成し、"MainScene"ノード(ルートノード)にアタッチします。
script.1 ジョイパッドの情報を取得する
script.1 を順番に解説します。
まず、_process(_delta)メソッドでジョイパッドが接続されているかを常にチェック(ポーリング)します。
クラス名 : Input
接続されているジョイパッドのインデックスを配列で返します。
次に、ウィンドウのボタンが押された場合、_on_set_button_pressed()メソッドで情報を取得します。
- ジョイパッドが検出できていないときは処理を抜けます
- get_joy_infoメソッドで最初に検知したジョイパッドについての情報を取得します。取得した情報は辞書型です。
- ジョイパッドのインデックスを、joypad_info辞書型に"xinput_index"を指定して取得します。
クラス名 : Input
指定したジョイパッドのインデックスについての情報を辞書型で返します。
※ Windows環境では xinput_index 項目のみ取得できます。
3.ジョイパッドの識別名を取得する
次に、接続したジョイパットがGodotでの識別名を取得してみます。
"sample_sceipt1.gd" (script.1)の"_on_button_pressed()"メソッドの中身を、
次のスクリプト(script.2)のように変更します。
script.2 ジョイパッドの識別名を取得する
クラス名 : Input
指定したジョイパッドのインデックスについての識別名を文字列型で返します。
4.ジョイパッドの指定のボタンが押されたことを知る
次のスクリプト(script.3)を作成し、"MainScene"ノードにアタッチします。
script.3 ジョイパッドの識別名を取得する
作成したら実行して、ジョイパッドのAボタンを押してみます。
何度か試しましたが、試すたびに反応する回数が変わってしまいました。(fig.4)
「1回だけ」反応させるには工夫が必要なようです。
次項でやってみます。
5.インプットマップにゲーム実行中からボタンを割り当てる
「プロジェクト設定」の「インプットマップ」に「Jump」を設定します。(fig.5)
まだボタンは割り当てません。
"SetButton" のインスペクターからトグルモードをオンにします。(fig.6)
"MainScene"にアタッチするスクリプトを作成します。(script.4)
script.4 インプットマップにゲーム実行中からボタンを割り当てる
使い方は次の通りです。
- "SetButton"をクリックしてON状態にします
- ジョイパッドのボタンを押します
- アクションマップに登録され、出力ウィンドウに押されたボタンのIDを表示します
- "SetButton"をクリックしてOFF状態にします
- 先ほどと違うボタンを押します
- 出力ウィンドウに新しい表示は出ません
- アクションマップに登録したジョイパッドのボタンを押します
- 出力ウィンドウに押されたボタンのIDが表示されます
主なメソッドについて紹介します。
クラス名 : Input
何かの入力があった場合に true を返します。
クラス名 : InputMap
引数1 : インプットマップに存在するアクション名
引数2 : インプットイベント)
入力したものをインプットマップに存在するアクション名に割り当てます
クラス名 : Input
引数 : インプットマップに存在するアクション名
アクション名に割り当てたボタンが押されたときに InputEvent配列に格納します
クラス名 : 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