Godot Szene Methode wird zu Button nicht angezeigt?
Moin ich bin neu bei Godot. Ich habe nun ein Signal einem Button hinzugefügt namens press. Nun ist das problem, wenn ich in dessen funktion die funktion geschrieben habe, das eine Fehlermeldung angezeigt wird.
"method not found".
Das Signal ist mit dem richtigen Button verknüpft und auch im funktionsfenster, habe ich die funktion dazu geschrieben.
Was jedoch seltsam ist, ist das bei meiner Szene.gd im script editor steht "Methode filter" und in diesem Fenster keine einzige methode aufgelistet ist.
Poste mal deinen Code - vllt kann man dann besser sehen, woran es hakt - und...verwendest du Godot 3.x oder 4.x? - da hat sich einiges verändert
es geht um eine pause funktion bei der tase escape.
Einmal escape pause + pause screen. 2x Escape resume. Godot 4 nutze ich.
1 Antwort
ich habe es selber mal getestet - einen Button erstellt, und bei nem Input (Esc) soll das Signal "press" ausgegeben werden - dann eine Funktion geschrieben und den ganzen Spaß in der _process() "verbunden" - hat bei mir problemlos hingehauen - befindet sich die Funktion, die ausgeführt werden soll im selben Script.gd - wenn nicht, muss du den Pfad vom Node, wo die Funktion hinterlegt ist, noch angeben
Aber um wenn es ne reine Taste ist, die gedrückt werden soll - kannste auch einfach nen _unhandled_input(event) verwenden, und darüber die Funktion aufrufen oder direkt da rein schreiben - dann musste dich nicht mit Signalen rumärgern
bei versuch 2 steht dieser teil im "player"
await pauseactivate (node)
if player press escape and pause == true:
unpause
OK - ich habe die Pausensache mal bei mir getestet - ich habe oben ne Variable "pause : bool = false" hinterlegt.
Dann ein _unhandled_input(event):
if event.is_action_pressed("ESC") and pause == false:
set_process(false)
pause = true
elif event.is_action_pressed("ESC") and pause == true:
set_process(true)
pause = false
klappt bei mir problemlos - habe letztens in nem YT Video mal ne ähnliche Herangehensweise, allerding mit Negation gesehen - war deutlich eleganter gelöst - aber das hier funktioniert auch
was steht in deiner Pausenfunktion drin?
Anstatt das await, würde ich dir nen Timer empfehlen - und dann mit nem timeout Signal arbeiten - await ist ne feine Sache, problem ist aber,, dass der process im Hintergrund weiterläuft - zb wenn du Variablen Werte aufrechnest oder oder oder - hatte da beim Pfadverfolgung via AStarGrid auch schon meine Probleme mit, dass die Figur die "verlorene Zeit" durch das await, durch schnelleres gehen wieder aufholt usw
world.gd:13 @ _unhandled_input(): The InputMap action "ESC" doesn't exist.
<C++-Fehler> Condition "!E" is true. Returning: false
<C++-Quelle> core/input/input_map.cpp:221 @ event_get_action_status()
<Stacktrace> world.gd:13 @ _unhandled_input()
Leider. Ich habe den Code in die world.gd gepackt. Leider gibt es bei der World kein Signal namens "unhandled_input". Beim Player hingegen gibt es "input event" als signal.
Womit hast du das verknüpft. Ich denke, das es deshalb nicht funktioniert. Das Spiel startet. Wenn ich ESC drücke kommt die Fehlermeldung.
Ergänzung: Ich habe dann nachgeguckt, bei mir heißt das input event für escape "ui_cancel" . dann habe ich "ESC" in "ui_cancel" geändert. Das hat das Problem nicht gelöst. Jetzt passiert gar nichts auch keine Fehler.
nene - unhandled_input ist kein Signal - das ist ne Funktion:
func _unhandled_input(event):
if event.is_action_pressed("ESC")
## mach irgendwas
Die Funktion kannste Global als Singleton aufrufen - und funktioniert. Das "ESC" war ist ne Tasten oder Controllerbelegung, die man via Settings -> Input Map selber definieren kann - benutze lieber keine Sachen, die mit "ui_" beginnen - sind dem System - zB für Menüs, die du irgendwann selber erstellst, vorbehalten - klappt zwar auch damit, aber nutze eigene InputMaps
nene da geht es um ein Spiel. Das ist ja das Problem. das doppelt escape macht es immer unmittelbar.
wenn ich dem charakter die pause funktion gebe und , dann geht es, das unpausieren hingegen ist immer das riesen problem.
ich hatte eine node in die world gesetzt, die dann das spiel unpausieren soll.
versuch 1:
also if player press key escape :
pause
if player press escape and pause == true:
unpause
versuch 2:
pauseactivate node:
if player press key escape :
pause
await pauseactivate (node)
if player press escape and pause == true:
unpause
ich hatte noch einen dritten Versuch, der auch relativ ähnlich wie diese
beiden ist, nur das die node pauseactivate und pausedeactivate existierte.
Es hat keine der Versuchen geklappt. Meist passierte gar nichts. Manchmal lies sich das game nur pausieren, nicht unpausieren.
aus yt hatte ich auch noch eine möglichkeit ausprobiert. diese wo man nodes als autostart hinzufügen kann,
die hat bei godot 4.0 nicht geklappt, weil die methode nicht existierte. Diese möglichkeit glaube ich gibt es nur bei godot 3 .
🤔