跳到主要内容

在编辑器中运行代码

tool是什么?

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

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

危险

tool 脚本在编辑器内运行,让你访问当前编辑的场景树。这是一个强大的功能,但也有一些注意事项,因为编辑器不包括对 tool 脚本潜在滥用的保护。在操作场景树时,尤其是通过 Node.queue_free(作用为删除这个node节点) 时,要极其谨慎, 因为如果你在编辑器运行涉及到节点的逻辑时释放该节点,可能会导致崩溃。

如何使用

要把一个脚本变成一个工具, 在你的代码顶部添加关键字tool

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

func _process(delta):
if Engine.editor_hint:
# 想在编辑器中执行的代码

if not Engine.editor_hint:
# 想在运行时执行的代码

备注

编辑器中的修改是永久性的。如果你在脚本中对节点的坐标进行的修改,那么当你删除脚本时,节点的坐标不会恢复成原来的样子。

简单的小案例

tool
extends TextureRect

# 在"setget"之后的函数set_speed与你的输入一起执行, 以改变这个变量
export var speed = 10 setget set_speed

func _process(delta):
# 只在编辑器中运行
if Engine.editor_hint:
rect_rotation += speed



func set_speed(new_speed):
speed = new_speed

在场景中添加一个TextureRect节点,并将纹理设置为 icon.png(在DefaultRes文件夹中),并打开脚本,将其更改为如上代码。其中,setget表示变量的编辑,在你修改speed变量时会调用set_speed以改变这个变量,您可以在编辑器中调整这个变量以修改旋转速度。保存脚本并返回编辑器,您应该可以看到您的对象在旋转。如果没有变化,请重新加载场景(关闭再打开)。但由于使用了Engine.editor_hint,所以在运行该案例时,它不会旋转。

texture_rotate

note

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