节点操作

Godot 使用节点作为组成游戏物体的基本单位,因此操作节点就等于操作游戏中的物体。

注意哈,本节是讲操作节点,而不是操作节点上的属性

我们上一节见到了 get_parentadd_child 方法,这一节我们多认识几个操作节点的方法。

获取节点

我们之前见到过 $xxx 这种写法,其实有一个和它功能相同的方法,叫做 get_node,不过 $ 符号用起来更方便,所以基本上很少会用 get_node

$节点名 这种写法大家应该都认识,就是获取子物体中叫做 节点名 的那个节点。

节点名可能包含一些奇怪的符号,直接把名字写在 $ 后面会出现语法错误,比如有个节点叫做 外.币 巴-伯,这时就可以使用字符串来表示节点名,变成 $"外.币 巴-伯" 即可。

准确来说,$ 符号后面填写的并不是节点名,而是节点路径,例如我们可以使用两个点 .. 表示上一级,或者使用 /root/ 开头表示场景根节点,下面来看几个例子:

  • $"../ABC" 获取和当前脚本所在节点同级的 ABC 节点

  • $"../../../" 获取自己的父节点的父节点的父节点

  • $"/root/BFG" 获取场景中最外层的 BFG 节点

添加节点

添加节点其实就是 add_child 方法,调用哪个节点的 add_child 就是给那个节点添加子节点。

例如 $ABC.add_child(新节点) 就是给 ABC 节点添加子节点。

删除节点

删除节点有两个方法:freequeue_free

一般情况下我更建议使用 queue_free 来删除节点,方法名中的 queue 是队列的意思,可以理解成排队,也就是说这是让节点排队删除,而不是立刻删除。

free 则是立刻删除节点,在调用 free 时,Godot 就会立刻删除这个节点。

我们来看个例子:

# 这是举例用的错误代码
free()
print(position)

运行这段代码游戏会报错,因为执行 free 时就会立刻删除这个节点,而下面的代码要输出 position 这个位置属性,可是节点已经被删除了,哪里还有位置呢。

如果我们将 free 换成 queue_free 则可以避免这个报错,Godot 会先将调用 queue_free 的节点记录下来,等咱们的代码执行完毕后,在空闲时间时再将它们删除。

某些生命周期或信号中使用 free 会直接报错,因为 Godot 内部有一种节点锁定机制。