👏

【Godot】NodePathで変数にアクセスしたい

2022/10/31に公開

NodePathについて

GodotのNodePathはノードやプロパティを指す文字列です。
ノードを指す場合:Path/To/Node
プロパティを指す場合:Path/To/Sprite:offset:x

ノードを指している場合はget_node()find_node()でノードにアクセスすることができますが、プロパティを指している場合にはそうはいきません。

NodePathで変数にアクセスして値を取得/変更したい

$Path/To/Sprite.offset.x=100のようにコード上で変数にアクセスすることができず、対象の変数のノードパスでアクセスしたくなりました。
自分が調べた限りではPath/To/Sprite:offset:xのようなノードパスを使って変数に直接アクセスする方法は用意されていないようです。
しかしget_node("Path/To/Sprite")で対象ノードにはアクセスすることができ、get_indexed(),set_indexed()で対象の変数(:offset:x[1])にアクセスすることができます。

例えば、Path/To/Sprite:offset:xの値は下記のように取得/変更することができます。

get_node("Path/To/Sprite").get_indexed("offset:x")
get_node("Path/To/Sprite").set_indexed("offset:x", 100)

ノードパスを文字列処理で分解してやれば上の処理は関数にすることもできます。

# 値を取得する
func get_node_property(path:String):
    var colon_index:int=path.find(":")
    var node:Node=get_node(path.left(colon_index))
    return node.get_indexed(path.right(colon_index))


# 値を変更する
func set_node_property(path:String, val):
    var colon_index:int=path.find(":")
    var node:Node=get_node(path.left(colon_index))
    node.set_indexed(path.right(colon_index), val)

ちなみに、Path/To/Sprite:offsetを変更するだけなら普通にset(),get()を使う方が良いと思います。

get_node("Path/To/Sprite").get("offset")
get_node("Path/To/Sprite").set("offset", Vector2(100,0))
脚注
  1. :offset:xでもoffset:xでもアクセスできるようです。 ↩︎

GitHubで編集を提案

Discussion