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

Tho*_*ald 5 godot

我无法将 SliceAndCoagulatorScene 链接到脚本以将其可见设置为 false 我已经尝试过了get_node$res://...

extends Node2D

onready var main_scene = get_node(".")
onready var SliceAndCoagulatorScene = get_node("_________")



func _ready():
    
    main_scene.visible = true
Run Code Online (Sandbox Code Playgroud)

这就是我想放在后面的内容:

SliceAndCoagulatorScene.visible = false

我该怎么做,非常感谢任何帮助

The*_*aot 3

为了清楚起见:res://场景树中不存在路径,它存在于虚拟文件系统中。因此,您无法从 访问它get_node。由于get_node作用于场景树,因此需要先加载并实例化场景树中的场景。

如果您已将场景添加到编辑器中的场景树中,那么它将加载它并为您实例化它,并且您将有一个可以放入的路径get_node......但它不会是一个res://路径,因为,再一次,res://虚拟文件系统中存在路径。

您将res://路径提供给load(或load_interactive,请参阅后台加载,或change_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
Run Code Online (Sandbox Code Playgroud)

我建议使用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
Run Code Online (Sandbox Code Playgroud)

然后在检查器面板中,您将看到一个新属性“Packed Scene”(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)
Run Code Online (Sandbox Code Playgroud)

然后在检查器面板中,您将看到一个新属性“目标场景”,您可以在其中指定要访问的节点在场景树中的位置。另外,如果您在编辑器中的场景树中移动节点,它会为您更新路径。

然后你可以这样做:

func _ready():
    scene_node.visible = false # or whatever
Run Code Online (Sandbox Code Playgroud)

注意:如果您不知道场景是否已加载。您可能有兴趣使用find_node. Control还提供一个get_node_or_null.