笔记:个人对于godot中yield的一些理解
研究了一下yield,做个笔记
- yield是关键字。
- yield会返回一个对象,类型是GDScriptFunctionStat
这个对象保存了中断时函数的状态,这个对象有个函数resume(),可以继续执行中断的函数。
这个对象运行完成会发出completed信号,有了这个信号就可以实现yield的嵌套。
extends Node #嵌套演示
func _ready():
funA()
func funA():
print("a_start")
yield(funB(),"completed")
print("a_end")
func funB():
print("b_start")
yield(get_tree().create_timer(2),"timeout")
print("b_end")结果是先输出a_start,b_start,等待2秒后输出b_end,a_end
- yield(target,signal)
目前猜测,由于yield返回的是一个GDScriptFunctionStat实例,该类继承reference,没有引用会被回收。
所以必须有个对象保持它的引用,由于信号没有保持它的引用,所以是target保持了它的引用。
target在emit_signal时会顺便检测有没有GDScriptFunctionStat的实例需要resume,如果有就resume它。
这就实现了yield等待信号的效果。
yield可以传递参数
extends Node
signal sig
func _ready():
var a=yield(self,"sig")
print(a)
func _process(delta):
if Input.is_action_just_pressed("ui_accept"):
emit_signal("sig",10)输出结果是10.
yield也可以用来传递参数,可以实现选择的效果。
更加灵活的yield方式,可以被打断或者做其他操作
extends Node
var funcState
var die=false
func _ready():
funcState=testFunc()
func testFunc():
print(1)
wait(2)
yield()
print(2)
wait(2)
yield()
print(3)
func wait(time):
get_tree().create_timer(time).connect("timeout",self,"onTimeOut")
func onTimeOut():
if !die:
funcState=funcState.resume() //死亡就不会继续运行,被打断了目前想到这些,yield用来做剧情应该是没问题的
做技能系统还有待研究
欢迎讨论
(转发自:原日志地址)


