从 Godot 中的另一个脚本访问 var

问题描述 投票:0回答:1

Node World 包含两个子节点 - Pe2nodeHUDPe2node (Node2D) 节点已附加 pe2.gd 脚本,并且它具有变量 - shiftHUD节点(CanvasLayer)已附加HUD.gd脚本,我想要显示来自Pe2node的变量shift。我尝试了一些变体,但根本不起作用。我已经准备好尝试自动加载,但可能有一种简单的方法可以让它工作。 HUD.gd:

extends CanvasLayer

var fps=0
var shift_hud=0

func _process(delta):
    fps = Engine.get_frames_per_second()  
    $var_fps.text=str(fps)
    #shift_hud=get_node("Pe2node").get_variable("shift")
    #shift_hud=get_node("Pe2node").shift
    #shift_hud=get_node("World/Pe2node").shift
    #shift_hud=$World/Pe2node.shift
    $var_shift.text=str(shift_hud)
godot gdscript
1个回答
4
投票

Node World 包含 2 个子节点 - Pe2node 和 HUD

这意味着

Pe2node
HUD
是兄弟姐妹,对吧?

让我们回顾一下您的尝试:

  1. get_node("Pe2node")
    

    这是寻找当前节点的

    "Pe2node"
    子节点,而不是兄弟节点。

  2. get_node("World/Pe2node")
    

    现在您正在寻找当前节点的

    "Pe2node"
    子节点的
    "World"
    子节点。

  3. $World/Pe2node
    

    同上。

您可以升一级,如下所示:

get_node("../Pe2node")

或者像这样:

$"../Pe2node"

或者你可以有一个绝对路径,我不会举例,但是如果你

print
在你想要的
get_path
上调用
Node
的结果,它将显示绝对路径(它以
"/root/"开头) 
)。


我经常不建议按照我上面描述的方式这样做的原因是因为它取决于这些节点的相对位置,你可能不会一起移动这些节点,从而破坏代码。

更好的方法(无需使用自动加载解决方案)是导出

NodePath
:

export var node_path:NodePath

您可以在检查器面板中将其设置为您想要的节点。然后我们用它来获取节点:

get_node(node_path)

只要您连接的东西从一开始就在场景树中(您不尝试动态获取某些东西),这就会起作用。只要是这种情况,并且您仅从 Godot 界面操作场景,Godot 就可以保持

NodePath
更新。


根据自动加载解决方案,我建议将信号放在那里。您只需一个信号就可以自动加载:

extends Node

signal shift_changed(value)

这就是自动加载的全部代码。

您可以创建该脚本,然后将其添加为项目设置中的自动加载,并使用一些名称。我将使用这个名字

SignalBus

然后从任何地方发出信号:

SignalBus.emit_signal("shift_changed", value)

从任何地方连接到它:

SignalBus.connect("shift_changed", self, "_on_shift_changed")

假设有这样的方法:

func _on_shift_changed(value) -> void:
    pass

这意味着您不再需要任何类型的节点路径,因此不存在可能中断的路径。另外,您可以仅在值更改时更新 UI,而不是一直检查。另一边可能没有东西,所以这也适用于动态实例化的东西。


公平地说,您可以将变量而不是信号放在自动加载上。这也有效。在某些情况下,在那里放置对

Node
的引用很有用。

将变量放置在那里的优点是,它还为您提供了一个放置所有变量的位置,这对于保存/加载功能也很有用,并且在从一个场景到另一个场景时也可以保留它们。

© www.soinside.com 2019 - 2024. All rights reserved.