[译]在godot中利用yield函数来使用协程(Coroutines)
Coroutines with yield
GDScript 提供yield
内建函数用以支持coroutines。调用yield()
将会立刻从当前函数返回,同时将这个函数的当前状态冻结作为返回值。如果之后通过返回值得到的对象调用resume
(继续)方法,就会继续从上个冻结状态执行下去并返回下一个返回值。一旦调用过resume
方法后,之前的得到的状态对象就失效了。例子如下:
func my_func():
print("Hello")
yield()
print("world")
func _ready():
var y = my_func()
# Function state saved in 'y'.
print("my dear")
y.resume()
# 'y' resumed and is now an invalid state.
输出结果:
Hello
my dear
world
在yield()
与resume()
调用之间我们也可以传递参数,例子如下:
func my_func():
print("Hello")
print(yield())
return "cheers!"
func _ready():
var y = my_func()
# Function state saved in 'y'.
print(y.resume("world"))
# 'y' resumed and is now an invalid state.
输出结果:
Hello
world
cheers!
Coroutines & signals
与signal(信号)机制结合使用才会发挥yield
真正的长处。 yield
方法可以接受两个参数,一个对象引用,一个信号名称。效果是:收到该信号时,重新开始执行该协程。例子如下:
# Resume execution the next frame.
yield(get_tree(), "idle_frame")
# Resume execution when animation is done playing.
yield(get_node("AnimationPlayer"), "finished")
# Wait 5 seconds, then resume execution.
yield(get_tree().create_timer(5.0), "timeout")
协程本身使用名为completed
的信号来表达他们转移进入了一个无效状态,例子如下:
func my_func():
yield(button_func(), "completed")
print("All buttons were pressed, hurray!")
func button_func():
yield($Button0, "pressed")
yield($Button1, "pressed")
my_func
仅当两个button按钮都被按过以后才会继续执行。
参考
(转发自:原日志地址)