Wie kann ich in Godot Variable über verschiedene Skripts auslesen?

1 Antwort

Ich sehe da verschiedene Wege.

Wenn das andere Skript einem Knoten im selben Scene Tree zugeordnet ist, brauchst du nur zu dem jeweiligen Knoten navigieren und kannst über diesen auf Variablen oder Funktionen zugreifen. Hier habe ich es schon einmal an einem Beispiel gezeigt.

Ein anderer Weg wäre ein Singleton-Knoten. So ein Konstrukt eignet sich beispielsweise für globale Spieleinstellungen. Wie man so ein Singleton erstellt und auf es zugreift, zeigt die Dokumentation.


StormOfGalaxy 
Beitragsersteller
 28.02.2022, 18:20

Vielen Dank erstmal für die Antwort, sie hat mir auch weitergeholfen.

Nun habe ich aber das Problem, dass wenn die Variable einen Bestimmten wert hat, soll sie einen neuen Wert zugewiesen werden. Doch dieser Befehl soll die ganze Zeit die Variable überprüfen, was er bisher nicht tut.

0
regex9  28.02.2022, 22:58
@StormOfGalaxy

Dann markiere sie bitte als Lösung (HA) für diesen Fragethread. 😉

Doch dieser Befehl soll die ganze Zeit die Variable überprüfen, was er bisher nicht tut. (...)

Ändere die Variable einfach immer nur über eine bestimmte Funktion.

In diesem Beispiel gibt es eine Methode set_some_variable, die künftig als Schnittstelle dient. Wenn die Variable geändert werden soll, dann nur über einen Aufruf dieser Methode.

var some_variable = 0

func set_some_variable(value):
  if value == 1:
    some_variable = 2
  else:
    some_variable = value

So lassen sich Filter oder Reaktionen auf einen bestimmten Wert implementieren. Im obigen Snippet würde die Variable beispielsweise den Wert 2 bekommen, wenn man versucht, ihr den Wert 1 zuzuordnen.

Dieses System könnte man noch weiter ausbauen, wenn man verschiedene Beobachter installieren möchte, die auf einen Zustandswechsel reagieren können sollen. In Godot gibt es dafür ein Signal-Slot-System.

Das Skript mit der Variable:

signal some_variable_changed(old_value, new_value)

var some_variable = 0

func set_some_variable(value):
  if some_variable == value:
    return
  
  var old_value = some_variable
  some_variable = value
  emit_signal("some_variable_changed", old_value, value)

Die set-Methode triggert diesmal ein Signal, sollte sich die Variable geändert haben.

Andere Skripte könnten folgendermaßen einen Slot an dieses Signal hängen, um bei Änderung der Variable darauf reagieren zu können.

node = # find node with some_variable ...
node.connect("some_variable_changed", self, "on_some_variable_changed")

Die Slotdefinition sieht im Grundaufbau so aus:

func on_some_variable_changed(old_value, new_value):
  # do something ...
1