在编辑器中运行代码
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
,所以在运行该案例时,它不会旋转。
note
其他节点的代码不会在编辑器中运行。您对其他节点的访问权限被限制了。您可以访问树和节点及其默认属性,但无法访问用户变量。如果要这样做,其他节点也必须在编辑器中运行。AutoLoad 节点是无法在编辑器中访问的。