Godot-StartUP

创建于:2018-07-28

创建人: Justus

44 信息 154 成员
讨论基于Godot以及Unity引擎的游戏开发经验,理论和最佳实践。共享一些通用思路以启发另一种生产工具中的实践。独立开发群QQ: 122017359

笔记:个人对于godot中yield的一些理解

logoss 2018-10-25

研究了一下yield,做个笔记

这个对象保存了中断时函数的状态,这个对象有个函数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用来做剧情应该是没问题的

做技能系统还有待研究

欢迎讨论

(转发自:原日志地址

近期喜欢的会员

 

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册