+6 votes

So, is there a built-in function to GDScript where I can pause a process in a script for a few seconds, say:

set_visible(false)
wait(1) #waits for 1 second
set_visible(true) #then continues the rest of the script after the 1 second wait
asked Aug 16, 2016 in Engine by apekke (27 points)
edited Aug 16, 2016 by Akien

3 Answers

+12 votes
Best answer

Try:

var t = Timer.new()
t.set_wait_time(3)
t.set_one_shot(true)
self.add_child(t)
t.start()
yield(t, "timeout")
answered Aug 16, 2016 by twinpixel (185 points)
selected Aug 17, 2016 by apekke

Don't forget to free the timer afterwards, or you'll cause a memory leak.

t.queue_free()

this works, but i tried to turn it into a function which didn't
anyone knows why?

func wait(s):
var t = Timer.new()
t.setwaittime(s)
t.setoneshot(true)
self.addchild(t)
t.start()
yield(t, "timeout")
t.queue
free()

func _ready():
hide()
wait(4)
show()

it took me legit 10 minute to create an account to ask this because u have to click on send me a confirmation mail. that's so unnecessary so here are some random chinese letters 阿贵冉宋日国

Weirdly enough, when I did this in it's own function, it didn't work, but when I had the exact same code on the place where I called the wait function, it worked.

This is not the best answer, since Godot has it's own dedicated function for this use-case: create_timer
(which is already mentioned in the comment below

So if you Googled this issue and ended up on this thread, check the create_timer function and yield-ing it instead of creating your own Timer

create_timer

is not a better idea. It can work in some cases, but if the object that creates the timer is freed, the game will crash. In general it's best to avoid using yields until Godot 4.0, as I believe they fixed the issue.

+2 votes
answered Aug 16, 2016 by Akien (1,865 points)

Note that if you use those in the main thread, those will cause the project to freeze until the delay has expired.

+15 votes
yield(get_tree().create_timer(1.0), "timeout")
answered Nov 9, 2018 by ttkhila (38 points)

Does the timer created here get disposed?

I believe that, once the routine has been resumed, the SceneTreeTimer object, returned by the create_timer () function, becomes invalid, as documented at:
https://docs.godotengine.org/en/3.0/getting_started/scripting/gdscript/gdscript_basics.html?highlight=yield#coroutines-with-yield

Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read How to use this Q&A? before posting your first questions.