【问题标题】:Export NodePath as an absolute in Godot将 NodePath 导出为 Godot 中的绝对路径
【发布时间】:2022-12-15 11:19:53
【问题描述】:

尝试制作一种简单的方法将场景实例附加到游戏编辑器中的其他场景实例。我发现你可以导出一个 NodePath 并且它可以工作......除了它总是获取相对于我附加到它的场景的路径。我最终不得不对路径进行一些巧妙的编辑,以使其从实际调用函数以更改场景实例的节点开始工作。它变得比我想要的更多工作,我想知道是否有更简单的方法。我的目标是简单地将编辑器中的场景实例附加到移动中,而不必担心每个实例附加到哪个父级。有没有办法向编辑器指定我想要导出和保存的绝对路径,而不是相对路径?

就像是:

export (NodePath, absolute) var button_1_passage_path  

【问题讨论】:

    标签: export var godot


    【解决方案1】:

    处理亲戚NodePaths

    我最终不得不对路径进行一些巧妙的编辑,以使其从实际调用函数以更改场景实例的节点开始工作。

    您不需要任何巧妙的编辑。你只需要从另一个Node 调用它。

    而不是这样做:

    var node = get_node(other_node.node_path_variable)
    

    做这个:

    var node = other_node.get_node(other_node.node_path_variable)
    

    使NodePaths 绝对化

    有没有办法向编辑器指定我想要导出和保存的绝对路径,而不是相对路径?

    这是一个不.

    编辑器将始终创建相对的NodePaths。我们无法解决它。

    要开始尝试解决它,我们需要使用 tool 脚本,因为我们想在编辑器上设置绝对 NodePath。

    但随后它会在编辑器场景树中运行,这与您在运行游戏时获得的场景树看起来不同......因此编辑器场景树上节点的绝对路径在游戏中不起作用。

    并且没有办法计算运行游戏时它将拥有的绝对路径,因为这取决于您实例化正在编辑的场景的位置。

    如果您正在编辑的场景是当前场景(未在另一个场景中实例化),我们充其量可以计算绝对路径,但是 NodePath 将是脆弱的......一旦您在另一个场景中实例化场景,绝对 @987654333 @ 会错的。

    相对的NodePaths 就是这样。


    解耦场景

    我的目标是简单地将编辑器中的场景实例附加到移动中,而不必担心每个实例附加到哪个父级。

    一般的建议是不要到达现场之外。特别是不要使用硬编码的NodePaths 到达外面。如果您的场景取决于实例化它的位置,那么您的场景没有正确解耦。

    如果您需要场景与场景外部的节点进行通信,您的第一个选择是添加自定义信号,您可以在场景外部连接这些信号。对于无法通过信号传递的任何信息,您可以在现场使用父级调用方法。

    对于摘要:

    向下呼叫,向上发出信号

    参见Node communication (the right way)。


    是的,您可以公开 NodePath 属性,您可以在场景外设置这些属性。也就是说,您将告诉场景其他节点的位置。

    当您在场景树编辑器中移动 Nodes 时,Godot 应该更新您的 NodePaths。如果您发现它不存在的情况,请报告它们。我知道唯一不起作用的情况是当您剪切或复制Nodes 时。我猜这就是你一直在做的。因此,请尝试拖动它们,或使用上下文菜单中的 Reparent 选项。


    无论如何,使用NodePaths 只会让你进入一个松散耦合的场景。所以这里有一些其他的方法来完全分离你的场景:

    • 使用信号总线:自动加载随处可用。因此,您可以使用它们进行通信。在信号总线的情况下,您可以在定义信号的地方创建一个自动加载,因此这些信号可以连接并从任何场景中的任何脚本发出。我有一个解释elsewhere。

    • 使用基于资源的通信:当您在任何地方预加载资源或从编辑器设置资源时,您总是会得到相同的对象。因此,您可以使用资源进行通信。将相同的资源提供给多个节点,并在资源中定义它们都可以访问的属性,并发出它们都可以连接并且它们都可以发出的信号。我有一个例子elsewhere。

    【讨论】:

      【解决方案2】:

      我实际上为此找到了一个奇怪的解决方案! get_path() 将给出绝对路径 我使用的代码看起来像这样

      
      export(NodePath) var nodepath
      var absolute_nodepath
      
      func _ready():
        absolute_nodepath = get_node(nodepath).get_path()
      
      

      希望它有所帮助:D

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-28
        • 1970-01-01
        • 1970-01-01
        • 2012-01-31
        • 2017-08-01
        • 2011-11-07
        • 2011-05-02
        相关资源
        最近更新 更多