【Godot】Unique nameによるノードへのアクセス(v3.5〜)

Godot v3.5 から Unique nameという地味に便利な機能が追加されたので、その機能を紹介します

Unique nameによるノードアクセスについて

今までのノードアクセスの問題点

今まで、Godotでは以下のようなノード構造があった場合……

“Label3” にアクセスするためには、階層をたどって「$」または get_node() でアクセスする必要がありました

extends Node2D

func _ready() -> void:
  # $を使う場合
  var label = $Label1/Label2/Label3
  # get_node()を使う場合
  #var label = get_node("Label1/Label2/Label3")
  label.text = "hoge"

このあたりについて、詳しくは以下のページに書いています

【Godot】シーンとノードについて

ただ、この方法には以下の2つの問題点があります

  • ノード階層が変わった(階層を移動した)場合に、該当する部分すべてを修正する必要がある
  • 階層が深いとアクセスするパス(文字列)が長くなる

これらの問題を解消するために、v3.5 で実装されたのが、「Unique name」の仕組みです

Unique nameによるアクセスの設定方法

Unique nameを使うには、ノードの上で右クリックします。すると「%Access as Scene Unique Name」と表示されるのでこれを選びます(※現在は未翻訳っぽいので、いずれ翻訳されて別の文字に変わるかもしれません…)

するとノード名の右隣りに「%」と表示されます。これが表示されれば「Unique name」が有効となります

Unique nameのノードにスクリプトでアクセスする (get_node())

スクリプトの記述は簡単で、get_node() で引数に “%Label3” を指定します。

extends Node2D

func _ready() -> void:
  # ユニーク名ノード "%Label3" を取得する
  var label = get_node("%Label3")
  label.text = "hoge"

これでノードがどの階層に存在しても、短い名前でアクセスできるようになります

Unique nameのノードにスクリプトでアクセスする (「$」を使う)

なお「$」を使った書き方は以下の通りとなります

extends Node2D

func _ready() -> void:
  var label = $"%Label3"
  label.text = "hoge"

参考

Godot 3.5 is Here!

Simplify code with Scene Unique Names in Godot 3.5