入力処理はどこに書くべきか

【Godotのバージョン】v4.6.1
【OSとそのバージョン】Linux Mint 22.3
【言語】GDScript
【内容】
現在2Dの見下ろし視点のSTGを製作中なのですが、プレイヤーの移動の入力処理はどこに書くのが一番良いのか気になったので質問させていただきました。
海外掲示板には「押下を検知するだけなら_input、長押しを検知したいなら_physics_process」と言っている方がいましたが、イマイチ腑に落ちていません。

_process、_physics_process、_input、_unhandled_inputなど、いろんな方法があると思いますが、皆さんは普段どうやって入力処理を書いているんでしょうか。また、どうやって使い分けたらいいんでしょうか。理由も含めて教えていただけると大変助かります。

【Webフォーラムへの掲載許可(可否)】OK


from Discord by tsukimitsushoya

私も詳しくないんですが、

書いてあるとおり、

「押下を検知するだけなら_input、長押しを検知したいなら_physics_process」
にしています。

プレイヤーの移動であれば、_physics_process もしくは _process であれば delta が引数で渡ってくるので、そこでフレームレートに依存せず移動量を計算できるので、そこで書くのが適しています。

_process と _physics_process の違いは、
衝突判定などの物理処理を伴うのは _physics_process に書くものらしいので、厳密な違いはわかっていませんがそれに従っています。


from Discord by tkmfujise

公式ドキュメントに書かれてました。

一方、_process() 関数は物理処理と同期されません。そのレートは一定ではなく、ハードウェアとゲームの最適化に依存します。シングルスレッドのゲームでは、物理ステップの後に実行されます。


from Discord by tkmfujise

ご回答ありがとうございます。

やはり_inputと_physics_processを使うんですね。しかし、そうするとプレイヤーの入力処理が複数箇所に散らばって見づらくなるような気がしてしまうんです。
何か可読性を上げるためのいい方法はありませんかね?


from Discord by tsukimitsushoya

すみません、
「プレイヤーの入力処理が複数箇所に散らばる」の具体的なシチュエーションがわからなったのですが、
同じシーン内で、_input と _physics_process 両方にインプットの処理を書くことは私はしたことないですが、異なるシーンでインプット処理が点在しているということでしょうか?


from Discord by tkmfujise

いえ、同じシーン内のつもりでした。
例えばプラットフォーマーゲームの場合、左右移動はis_action_pressedを使う(長押しする)ので_physics_processに書き、ジャンプはis_action_just_pressedを使う(押下を検知する)ので_inputに書くという風に捉えていたのですが、実際はどちらか一方にまとめるのでしょうか?


from Discord by tsukimitsushoya

私はいま2Dプラットフォームを作っていますが、_physics_process 内でプレイヤーの移動とジャンプを書いていますね。

↓みたいな感じです。


from Discord by tkmfujise

確かにそうですね。では、_inputはどういう場合に使っているのでしょうか?


from Discord by tsukimitsushoya

UI とかですね。


from Discord by tkmfujise

そうなんですね。すごく勉強になりました。それから、共有していただいたコードも見ていてすごく興味深かったです。
本当にありがとうございました。


from Discord by tsukimitsushoya