入力を伝える方法について

【Godotのバージョン】Godot_v4.6-stable_win64
【OSとそのバージョン】windows11
【言語】 GDScript
【Webフォーラムへの掲載許可(可否)】OK

【内容】
入力システムと武器システムをプレイヤーの子にしているのですが、この場合一度プレイヤーに入力をすべて伝えてから武器システムに必要な入力を伝えるのか直接武器システムに入力を伝えるのがいいのかどちらでしょうか?それとももっと良いやり方があるのでしょうか
godotが関係ない質問ですみません

from Discord by yorokoba

こんにちは。
どちらでも動きますが、シグナルで繋ぐのが Godot らしいやり方かなと思いました。

`# 入力システム: 何が起きたかだけ通知する
signal attack_pressed

func _unhandled_input(event):
if event.is_action_pressed(“attack”):
attack_pressed.emit()

Player: _ready でシグナルを繋ぐだけ

func _ready():
$InputSystem.attack_pressed.connect($WeaponSystem.attack)`

左図の例ですと、 Player に全部の入力処理が集まって肥大化しますし、
右図だと入力システムが武器システムを直接知っている必要があって差し替えが面倒に・・・

シグナルなら入力側は「押された」と言うだけ、
武器側は「呼ばれたら撃つ」だけで、お互いを知らなくていいので拡張が楽です。

シグナルについて詳しくは公式ドキュメントを参照してください


from Discord by mgnk33

構成としては左図に近いです。
ただ、違いとしては Player がロジックを持つか、接続だけかという点です:

  • 左図: Player が入力を受け取って、判断して、武器に命令する(Player にロジックが集中)
  • シグナルの場合: Player は _ready で connect するだけ。以降入力→武器の流れが自動的に通る。

Player が仲介者であることは変わらないですが、
仲介の仕方が「毎回手動で渡す」から「最初に配線するだけ」になる感じです。


from Discord by mgnk33

左右両方のパターンでも実現できますが、どうするかは実装次第だと思います。
例えば:

Player側で加工してから武器に渡したい場合(左図)
`# Player
func _ready():
$InputSystem.attack_pressed.connect(_on_attack)

func _on_attack():
# Player側で何か処理してから武器に渡す
if can_attack:
$WeaponSystem.attack()`

それぞれ独立して処理したい場合(右図)
`# Player
func _ready():
$InputSystem.attack_pressed.connect(_player_attack_animation)

WeaponSystem

func _ready():
get_parent().get_node(“InputSystem”).attack_pressed.connect(attack)`


from Discord by mgnk33

ありがとうございます!シグナルを使ってやってみます


from Discord by yorokoba

銃をマウスカーソルの方向へ向けるということをしたいのですがマウスの位置を毎フレームシグナルで送るのってOKなんでしょうか?シグナルってジャンプとか射撃とかの単発イベントみたいなのに使うイメージなので


from Discord by yorokoba

銃をマウスカーソルの方向へ向けるということをしたいのですがマウスの位置を毎フレームシグナルで送るのってOKなんでしょうか?シグナルってジャンプとか射撃とかの単発イベントみたいなのに使うイメージなので


from Discord by mgnk33

なるほど。Playerが仲介する方法でやってみようと思います。
多分これで解決すると思います!ありがとうございました!


from Discord by yorokoba