首页 > 解决方案 > 不知道如何在脚本中引用其他场景

问题描述

我无法将 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

我怎么能这样做,任何帮助表示赞赏

标签: godot

解决方案


为了清楚起见: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

我会建议使用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

然后在检查器面板中,您将看到一个新属性“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)

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

然后你可以这样做:

func _ready():
    scene_node.visible = false # or whatever

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


推荐阅读