Godot GDScript'te Sinyal Sistemi: Event-Driven Oyun Mimarisi

Godot'da sinyaller, düğümler (node) arasında gevşek bağlı iletişim kurmanın en temiz yoludur. Oyun tasarımında bir düğümün başka bir düğümü doğrudan çağırmasını önler; bunun yerine 'bir şey oldu' mesajı yayınlarsınız ve ilgilenen herkes dinler.

Örnek: Bir karakter ölüyor. Sağlık sistemi, UI, ses efektleri ve parçacık efektleri aynı anda tepki vermelidir. Sinyaller olmasa hepsini kod içinde zincir halinde çağırmanız gerekir. Sinyallerle her sistem bağımsız dinler.

İlk olarak özel bir sinyal tanımlayın:

1extends Node
2
3signal health_changed(new_health)
4signal player_died
5
6var health = 100
7
8func take_damage(amount):
9health -= amount
10emit_signal("health_changed", health)
11if health <= 0:
12emit_signal("player_died")

Başka bir düğüm bu sinyalleri dinler:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1extends CanvasLayer
2
3func _ready():
4var player = get_node("/root/Player")
5player.connect("health_changed", self, "_on_health_changed")
6player.connect("player_died", self, "_on_player_died")
7
8func _on_health_changed(new_health):
9$HealthLabel.text = "HP: " + str(new_health)
10
11func _on_player_died():
12$DeadScreen.show()

Eğer birden fazla dinleyici varsa, hepsi aynı anda tetiklenir:

1# Ses sistemi
2func _on_player_died():
3$AudioStreamPlayer.stream = load("res://sounds/death.ogg")
4$AudioStreamPlayer.play()
5
6# Parçacık efekti
7func _on_player_died():
8var particles = preload("res://effects/death_particles.tscn").instance()
9get_parent().add_child(particles)
10particles.global_position = global_position

Beklenen çıktı: Karakter sağlığı 0'a düştüğünde UI güncellenir, ses çalar ve efekt oynatılır, hepsi aynı sinyal tetiklemesinden.

Sık yapılan hata: Dinleyiciyi kaldırırken `disconnect()` kullanmayı unutmak. Düğüm silinirse bellek sızıntısı oluşur. Temiz kod için:

1func _exit_tree():
2var player = get_node_or_null("/root/Player")
3if player:
4player.disconnect("player_died", self, "_on_player_died")

Sinyaller oyun mimarisini modüler ve bakımı kolay hale getirir. Her sistem kendi işine bakar, başkasını bilmez.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz