研究了一下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用来做剧情应该是没问题的
做技能系统还有待研究
欢迎讨论
暂无关于此日志的评论。