不知道如何将其他场景引用到脚本中

问题描述

我无法将 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 loadingchange_scene),而不是 get_node。>

现在,您要么尝试定位已加载的场景,要么定位未加载的场景。


如果你的其他场景没有加载,你需要加载它(loadload_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