Godot 3.0 中遇到的 get_node 的坑

最近又开始玩 godot engine ,遇到了一个问题: get_node 无法通过绝对路径获取相邻节点

问题

假设有根节点 root,包含两个子节点 a 和 b,在 a 节点的 _ready 函数中,无法用 get_node 获取到 b 节点:

var b # b 节点
func _ready():
  var r = get_node("/root") # 可以获取到 root
  b = get_node("/root/b") # 空

原因

做了一些试验后,发现是这样一回事: a 节点执行 _ready() 时,b 节点还没有加入 root

由于 godot 的节点顺序是可以修改的,把 b 节点移动到 a 节点之前,问题是否可以解决呢?

答案是否定的,结果跟之前相同

所以推测 godot 加入节点的顺序并不是自上而下的,那么我们如何引用相邻节点呢? 这时其实答案已经一目了然了,我们需要在 root 的 _ready 函数中把 b 节点的引用交给 a, 简单的做法是直接赋值:

func _ready():
  get_node("a").b = get_node("b")

总结

_ready 这个函数只表示 该节点已就绪 ,相邻节点是否就绪未知,同时我们可以推论出, 当父节点就绪时,子节点均已就绪