问题描述
我无法将 SliceAndCoagulatorScene 链接到脚本以将其可见设置为 false 我已经尝试过 get_node
,$res://...
extends Node2D
onready var main_scene = get_node(".")
onready var SliceAndCoagulatorScene = get_node("_________")
func _ready():
main_scene.visible = true
这就是我想放在后面的内容:
SliceAndCoagulatorScene.visible = false
我怎么能做到这一点,感谢任何帮助
解决方法
为清楚起见:res://
路径不存在于场景树中,它存在于虚拟文件系统中。因此,您无法从 get_node
访问它。由于 get_node
作用于场景树,因此您需要先在场景树中加载并实例化场景。
如果你已经在编辑器中将场景添加到场景树中,那么它会加载它并为你实例化它,并且会有一个你可以放入get_node
的路径......但它不会是 res://
路径,因为在虚拟文件系统中同样存在 res://
路径。
您将 res://
路径提供给 load
(或 load_interactive
,参见 Background loading 或 change_scene
),而不是 get_node
。>
现在,您要么尝试定位已加载的场景,要么定位未加载的场景。
如果你的其他场景没有加载,你需要加载它(load
或 load_interactive
),它给你一个 PackedScene
,实例化它(instance
),它给出你是Node
。在这一点上你有一个参考,继续使用它。您可能想要添加到场景树中(例如 add_child
)。
例如,这里我们将新场景附加到根节点(这可能是您想要的,也可能不是您想要的,尤其是在面对不断变化的场景时,但那是另一个主题):
func _ready():
var packed_scene = load("res://something.tscn");
var scene_node = packed_scene.instance();
var root = get_tree().get_root();
root.add_child(scene_node);
scene_node.visible = false; # or whatever
我建议使用 PackedScene
导出:
export(PackedScene) var packed_scene;
onready var scene_node = load(packed_scene).instance();
func _ready():
var root = get_tree().get_root();
root.add_child(scene_node);
scene_node.visible = false; # or whatever
然后在检查器面板中,您将看到一个新属性“打包场景”(Godot 自动将名称大写),您可以在其中从文件系统中指定场景。另外,如果您在编辑器中移动文件系统中的场景,编辑器会为您更新路径。
注意:您可能想也可能不想将它们添加到 get_tree().get_root()
。其他选项包括将其添加到 get_tree().get_current_scene()
、get_owner()
、get_parent()
和 self
。
另一方面,您的两个场景都已加载到场景树中。在这种情况下,存在从一个节点到另一个节点的路径,您可以将其放入 get_node
。如果您的目标场景不是儿童,您可能希望使用 ..
提升几个级别。但是,我建议不要硬编码这样的路径。
相反,您将获得以下优势:
export(NodePath) var target_scene;
onready var scene_node = get_node(target_scene);
然后在检查器面板中,您将看到一个新属性“目标场景”,您可以在其中指定要访问的节点在场景树中的位置。另外,如果您在编辑器的场景树中移动节点,它会为您更新路径。
然后你可以这样做:
func _ready():
scene_node.visible = false; # or whatever
注意:如果您不知道场景是否已加载。您可能对使用 find_node
感兴趣。 Control
还提供一个 get_node_or_null
。