在编辑器中运行代码

什么是 tool

tool 是一行功能强大的代码,当它添加到脚本顶部时,会使它在编辑器中执行。您还可以决定脚本的哪些部分在编辑器中执行,哪些部分在游戏中执行,哪些部分在两者中执行。

你可以用它来做很多事情,但是它在层次设计中非常有用,可以直观地呈现那些难以预测的事情。以下是一些用例:

  • 如果你有一门大炮可以发射受物理(重力)影响的炮弹,你可以在编辑器中绘制炮弹的轨迹,使水平设计更容易。

  • 如果你有不同跳跃高度的跳板,你可以画出一个玩家跳到一个跳板上时所能达到的最大跳跃高度,也使得水平设计更容易。

  • 如果玩家不使用sprite,而是使用代码绘制自己,则可以在编辑器中执行该绘制代码以查看玩家。

如何使用它

要将脚本转换为工具,请添加 tool 代码顶部的关键字。

要检查当前是否在编辑器中,请使用: Engine.editor_hint .

例如,如果您只想在编辑器中执行一些代码,请使用:

if Engine.editor_hint:
    # Code to execute when in editor.

另一方面,如果只想在游戏中执行代码,只需取消前面的表达式:

if not Engine.editor_hint:
    # Code to execute when in game.

没有上述两个条件的代码片段将在编辑器和游戏中运行。

以下是如何 _process() 函数可能看起来像您:

func _process(delta):
    if Engine.editor_hint:
        # Code to execute in editor.

    if not Engine.editor_hint:
        # Code to execute in game.

    # Code to execute both in editor and in game.

注解

编辑器中的修改是永久性的。在我们的例子中,当我们移除脚本时,节点将保持其旋转方向。注意不要做不必要的修改。

试试看吧

添加 Sprite 节点到场景并将纹理设置为Godot图标。附加并打开脚本,然后将其更改为:

tool
extends Sprite

func _process(delta):
    rotation_degrees += 180 * delta

保存脚本并返回编辑器。现在应该可以看到对象旋转了。如果你运行游戏,它也会旋转。

../../_images/rotating_in_editor.gif

注解

如果看不到更改,请重新加载场景(关闭并再次打开)。

现在让我们选择在什么时候运行代码。修改您的 _process() 函数如下:

func _process(delta):
    if Engine.editor_hint:
        rotation_degrees += 180 * delta
    else:
        rotation_degrees -= 180 * delta

保存脚本。现在,对象将在编辑器中顺时针旋转,但是如果你运行游戏,它将逆时针旋转。

注解

其他节点的代码不会在编辑器中运行。您对其他节点的访问受到限制。可以访问树和节点及其默认属性,但不能访问用户变量。如果要这样做,其他节点也必须在编辑器中运行。在编辑器中根本无法访问自动加载节点。

警告

使用 tool 不正确会产生许多错误。建议您先根据需要编写代码,然后再添加 tool 关键字到顶部。还要确保将代码分成在编辑器中运行的部分和在游戏中运行的部分。这样你可以更容易地发现你的错误。