在编辑器中显示程序生成的对象
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。
我正在开展一个项目,在该项目中,我基于 OpenSimplexNoise 对象从程序块中组装出一个世界。这是通过在 _ready
函数中添加子节点来完成的。它运行良好并且生成的关卡可以玩,但我想在不玩游戏的情况下预览它。 是否可以这样做?
您可以通过制作 tool
脚本在 Godot 编辑器中 运行 编写代码。
只需在脚本开头添加 tool
关键字,这样就可以在编辑器上 运行。
但是,您可能不希望每个函数或代码的每个部分都 运行 在编辑器上。您可以通过检查 Engine.editor_hint
.
因此您可以在 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。