system
(system)
1
【Godotのバージョン】Godot_v4.6-stable_win64
【OSとそのバージョン】windows11
【言語】 GDScript
【Webフォーラムへの掲載許可(可否)】OK
【内容】
入力システムと武器システムをプレイヤーの子にしているのですが、この場合一度プレイヤーに入力をすべて伝えてから武器システムに必要な入力を伝えるのか直接武器システムに入力を伝えるのがいいのかどちらでしょうか?それとももっと良いやり方があるのでしょうか
godotが関係ない質問ですみません
from Discord by yorokoba
system
(system)
2
こんにちは。
どちらでも動きますが、シグナルで繋ぐのが 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
system
(system)
3
構成としては左図に近いです。
ただ、違いとしては Player がロジックを持つか、接続だけかという点です:
- 左図: Player が入力を受け取って、判断して、武器に命令する(Player にロジックが集中)
- シグナルの場合: Player は _ready で connect するだけ。以降入力→武器の流れが自動的に通る。
Player が仲介者であることは変わらないですが、
仲介の仕方が「毎回手動で渡す」から「最初に配線するだけ」になる感じです。
from Discord by mgnk33
system
(system)
4
左右両方のパターンでも実現できますが、どうするかは実装次第だと思います。
例えば:
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
system
(system)
5
ありがとうございます!シグナルを使ってやってみます
from Discord by yorokoba
system
(system)
6
銃をマウスカーソルの方向へ向けるということをしたいのですがマウスの位置を毎フレームシグナルで送るのってOKなんでしょうか?シグナルってジャンプとか射撃とかの単発イベントみたいなのに使うイメージなので
from Discord by yorokoba
system
(system)
8
なるほど。Playerが仲介する方法でやってみようと思います。
多分これで解決すると思います!ありがとうございました!
from Discord by yorokoba