节点操作
Godot 使用节点作为组成游戏物体的基本单位,因此操作节点就等于操作游戏中的物体。
注意哈,本节是讲操作节点,而不是操作节点上的属性
我们上一节见到了 get_parent
和 add_child
方法,这一节我们多认识几个操作节点的方法。
获取节点
我们之前见到过 $xxx
这种写法,其实有一个和它功能相同的方法,叫做 get_node
,不过 $
符号用起来更方便,所以基本上很少会用 get_node
。
$节点名
这种写法大家应该都认识,就是获取子物体中叫做 节点名
的那个节点。
节点名可能包含一些奇怪的符号,直接把名字写在 $ 后面会出现语法错误,比如有个节点叫做 外.币 巴-伯
,这时就可以使用字符串来表示节点名,变成 $"外.币 巴-伯"
即可。
准确来说,$ 符号后面填写的并不是节点名,而是节点路径,例如我们可以使用两个点 ..
表示上一级,或者使用 /root/
开头表示场景根节点,下面来看几个例子:
-
$"../ABC"
获取和当前脚本所在节点同级的 ABC 节点 -
$"../../../"
获取自己的父节点的父节点的父节点 -
$"/root/BFG"
获取场景中最外层的 BFG 节点
添加节点
添加节点其实就是 add_child
方法,调用哪个节点的 add_child
就是给那个节点添加子节点。
例如 $ABC.add_child(新节点)
就是给 ABC 节点添加子节点。
删除节点
删除节点有两个方法:free
和 queue_free
。
一般情况下我更建议使用 queue_free
来删除节点,方法名中的 queue 是队列的意思,可以理解成排队,也就是说这是让节点排队删除,而不是立刻删除。
而 free
则是立刻删除节点,在调用 free
时,Godot 就会立刻删除这个节点。
我们来看个例子:
# 这是举例用的错误代码
free()
print(position)
运行这段代码游戏会报错,因为执行 free
时就会立刻删除这个节点,而下面的代码要输出 position 这个位置属性,可是节点已经被删除了,哪里还有位置呢。
如果我们将 free
换成 queue_free
则可以避免这个报错,Godot 会先将调用 queue_free
的节点记录下来,等咱们的代码执行完毕后,在空闲时间时再将它们删除。
某些生命周期或信号中使用 free 会直接报错,因为 Godot 内部有一种节点锁定机制。