微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在场景启动中推迟自定义操作?

如何解决如何在场景启动中推迟自定义操作?

我想访问场景的根节点,但即使在其 _ready() 生命周期方法中,我也收到一个运行时错误,告知父节点正忙:

extends Node2D

func _ready():
    self.get_tree().get_root().add_child(preload("res://MainMenu.tscn").instance())
    # This works:
    # self.get_tree().change_scene("res://MainMenu.tscn")

我当前的脚本只是暂时改变场景。我知道我可以使用此 [object NodeTree].change_scene() 方法root_node.call_deferred(),但我希望能够观察到场景何时完全初始化,以便我可以自由使用其节点树。

解决方法

_ready 运行时,父节点还没有准备好(更不用说场景根了)。 Godot 还没有完成将子节点添加到父节点的例程。事实上,它只是添加了您当前的节点、您当前节点的子节点,并且正在您当前的节点上运行 _ready。在为您的当前节点及其兄弟节点完成此操作后,它将在您的父节点上运行 _ready,依此类推,直到到达场景根......然后它就准备好了。

Lightning_A 是正确的,在操作根之前插入 yield(get_tree().get_root(),"ready") 会起作用。 yield 将停止执行并安排它在给定信号后继续执行。在这种情况下,ready 信号。 _ready 完成后会发生这种情况。

这是你将如何使用它:

func _ready():
    yield(get_tree().get_root(),"ready")
    get_tree().get_root().add_child(preload("res://MainMenu.tscn").instance())

另一种常见的解决方案是插入 yield(get_tree(),"idle_frame")。信号 idle_frame 发生在 Godot 调用 _process 之前:

func _ready():
    yield(get_tree(),"idle_frame")
    get_tree().get_root().add_child(preload("res://MainMenu.tscn").instance())
,

Nodeready 信号对您有用吗?即yield(get_tree().get_root(),"ready")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。