💬

[Godot Engine]逆引きリファレンス(個人メモ)

2022/03/31に公開

ツリーの中から特定ノードを検索して取得

子ノードを検索するだけなら割と簡単。

func _find_child(_parent:Node, _name:String) -> Node:
	for _node in _parent.get_children():
		if _node.name == _name:
			return _node

idがわかっていればget_child(_id:int)でOKだが、孫以下のノード取得がしにくいので、ツリー全部を検索したい場合は以下

func _find_in_tree(_parent:Node, _name:String) -> Node:
	for _node in _parent.get_children():
		if _node.name == _name:
			return _node
		if _node.get_child_count() > 0:
			var _child:Node = _find_in_tree(_node, _name)
			if not _child == null:
			 	return _child
	return null

これだけだと、名前が被っている孫ノードの場合は最初に見つけたノードが返ってくるので、名前を必ず固有のノードで構成するか、この関数自体を少しカスタマイズする必要がある。

find_node( )

ツッコミを受けて改めて調べたところfind_node()関数が存在していました。
実際に試してみました。

func _ready():
	var _node = _parent.find_node("target_node")

上記だけで_parentで定義しているノードのツリーの中からtarget_nodeという名前の子孫を見つけてくれます。

このほうがはるかにシンプルですね。

※情報提供ありがとうございました @トカゲ

特定の数値をループする

よくあるのが、0,1,2,0,1,2...などと繰り返したい場合に使う関数。

var n = 0
n = wrapi(n+1, 0, 3)

上記は簡略化して書いているので、処理に入るとnが初期化されてしまうけど、
wrapiまたはwrapfで数値が繰り返されるようになる。

メニューの選択状態などで使うと便利。

Discussion