在编辑器中运行代码

tool 是什么?

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

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

  • 如果您有一门大炮发出受物理(重力)影响的炮弹,您可以在编辑器中绘制炮弹的轨迹,使得关卡设计更容易。
  • 如果您有不同跳跃高度的跳线,您可以绘制游戏角色能跳过的最大跳跃高度,也可以让关卡设计变得更容易。
  • 如果您的游戏角色不使用精灵,却使用代码来绘制,您可以在编辑器中执行该绘图代码以查看您的游戏角色。

危险

tool scripts run inside the editor, and let you access the scene tree of the currently edited scene. This is a powerful feature which also comes with caveats, as the editor does not include protections for potential misuse of tool scripts. Be extremely cautious when manipulating the scene tree, especially via Node.queue_free, as it can cause crashes if you free a node while the editor runs logic involving it.

如何使用它

要将脚本转换为工具,请在代码顶部添加 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

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

注解

其他节点的代码不会在编辑器中运行。 您对其他节点的访问权限被限制了。 您可以访问树和节点及其默认属性,但无法访问用户变量。 如果要这样做,其他节点也必须在编辑器中运行。 AutoLoad节点时无法在编辑器中访问的。

警告

不正确地使用 tool 可能会产生许多错误。 建议首先按照您想要的方式编写代码,然后只在顶部添加 tool 关键字。 还要确保将代码划分为在编辑器中运行的部分和在游戏中运行的部分。 这样您就可以更轻松地找到您的错误。