如何解决如何在场景启动中推迟自定义操作?
我想访问场景的根节点,但即使在其 _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())
,
Node
的 ready
信号对您有用吗?即yield(get_tree().get_root(),"ready")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。