在编辑器中显示程序生成的对象

Display procedurally generated object in the editor

我正在开展一个项目,在该项目中,我基于 OpenSimplexNoise 对象从程序块中组装出一个世界。这是通过在 _ready 函数中添加子节点来完成的。它运行良好并且生成的关卡可以玩,但我想在不玩游戏的情况下预览它。 是否可以这样做?

您可以通过制作 tool 脚本在 Godot 编辑器中 运行 编写代码。

只需在脚本开头添加 tool 关键字,这样就可以在编辑器上 运行。


但是,您可能不希望每个函数或代码的每个部分都 运行 在编辑器上。您可以通过检查 Engine.editor_hint.

来检测您的代码是否在编辑器上 运行ning

因此您可以在 func:

的开头添加此代码
    if Engine.editor_hint:
        return

这会阻止 func 的其余部分在编辑器上 运行ning。

或反其道而行之:

    if not Engine.editor_hint:
        return

这会阻止 func 的其余部分在编辑器之外 运行。


您还需要注意,代码对场景所做的更改……是对场景所做的更改。这包括添加节点和更改属性。

对于添加的节点,您可能不需要特别注意,因为通常您不会设置节点的 owner,因此这些节点不会在场景中持续存在。

但是,您需要注意属性。 如果您正在制作和添加插件,您可以将条目添加到撤消历史记录中。


我想当您的 OpenSimplexNoise 更改时,您会希望代码为 运行。所有 Resource 类型,例如 OpenSimplexNoise 都有一个可以连接的 "changed" 信号,并且会在它发生变化时发出通知。 对于制作自定义资源类型的人,知道您需要从代码中手动发出信号。

而且,我想,您只想在编辑器中执行此操作。而且您将需要处理删除旧节点和添加新节点的问题,或者有一种方法可以针对新噪声重建它们。

您可以先将逻辑从 _ready 移到另一个 func。然后 _ready 调用那个 func,只有当代码不在编辑器中 运行ning 时。然后你可以将 "changed" 信号连接到那个新的 func,所以每次它改变时它 运行s。这也意味着它应该从清理代码开始。


对了,我这里说的也是做插件的基础。所以我鼓励你研究一下。例如,可以扩展编辑器的UI。