有没有办法向编辑器指定我想要导出和保存的绝对路径,而不是相对路径?
这是一个不.
编辑器将始终创建相对的NodePaths。我们无法解决它。
要开始尝试解决它,我们需要使用 tool 脚本,因为我们想在编辑器上设置绝对 NodePath。
但随后它会在编辑器场景树中运行,这与您在运行游戏时获得的场景树看起来不同......因此编辑器场景树上节点的绝对路径在游戏中不起作用。
并且没有办法计算运行游戏时它将拥有的绝对路径,因为这取决于您实例化正在编辑的场景的位置。
如果您正在编辑的场景是当前场景(未在另一个场景中实例化),我们充其量可以计算绝对路径,但是 NodePath 将是脆弱的......一旦您在另一个场景中实例化场景,绝对 @987654333 @ 会错的。
相对的NodePaths 就是这样。
解耦场景
我的目标是简单地将编辑器中的场景实例附加到移动中,而不必担心每个实例附加到哪个父级。
一般的建议是不要到达现场之外。特别是不要使用硬编码的NodePaths 到达外面。如果您的场景取决于实例化它的位置,那么您的场景没有正确解耦。
如果您需要场景与场景外部的节点进行通信,您的第一个选择是添加自定义信号,您可以在场景外部连接这些信号。对于无法通过信号传递的任何信息,您可以在现场使用父级调用方法。
对于摘要:
向下呼叫,向上发出信号
参见Node communication (the right way)。
是的,您可以公开 NodePath 属性,您可以在场景外设置这些属性。也就是说,您将告诉场景其他节点的位置。
当您在场景树编辑器中移动 Nodes 时,Godot 应该更新您的 NodePaths。如果您发现它不存在的情况,请报告它们。我知道唯一不起作用的情况是当您剪切或复制Nodes 时。我猜这就是你一直在做的。因此,请尝试拖动它们,或使用上下文菜单中的 Reparent 选项。
无论如何,使用NodePaths 只会让你进入一个松散耦合的场景。所以这里有一些其他的方法来完全分离你的场景:
-
使用信号总线:自动加载随处可用。因此,您可以使用它们进行通信。在信号总线的情况下,您可以在定义信号的地方创建一个自动加载,因此这些信号可以连接并从任何场景中的任何脚本发出。我有一个解释elsewhere。
-
使用基于资源的通信:当您在任何地方预加载资源或从编辑器设置资源时,您总是会得到相同的对象。因此,您可以使用资源进行通信。将相同的资源提供给多个节点,并在资源中定义它们都可以访问的属性,并发出它们都可以连接并且它们都可以发出的信号。我有一个例子elsewhere。