この AGMPluginAction は Node 型を継承していないため、特定のノードをどのように指定すればよいでしょうか?
現時点では、@export var sprite_path: NodePath = NodePath() で指定するしかないようです。
いくつかの方法があります:
- NodePath
GameObject に対する相対パス(Sprite2D や UI/Label など)を入力し、実行時に p_owner から解決します(前述のスニペット参照)。
文字列名 + find_child:これが私がよく使う方法です。フルパスではなくノード名のみを入力するため、多少融通が利き、ノードの移動後も機能します:
@export var text_node_name: String = ""
func on_state_enter(p_owner: Object) -> void:
var owner_node := p_owner as Node
if owner_node == null:
return
var label := owner_node.find_child(text_node_name, true, false) as RichTextLabel
if label != null:
label.text = "Hello"
- クリック可能なリスト
Godot のピッカーに頼るのではなく、独自のドロップダウンを作成することもできます。少し手間はかかりますが、_validate_property で開いているシーン内のノードをスキャンし、候補としてノード名を渡します:
@export var text_node_name: String = ""
func _validate_property(property: Dictionary) -> void:
if property.name == "text_node_name":
property.hint = PROPERTY_HINT_ENUM_SUGGESTION
property.hint_string = _node_name_suggestions()
func _node_name_suggestions() -> String:
if not Engine.is_editor_hint():
return ""
var root := EditorInterface.get_edited_scene_root()
if root == null:
return ""
var names := PackedStringArray()
for n in root.find_children("*", "RichTextLabel", true, false):
names.append(n.name)
return ",".join(names)
エディタで開いているシーンからノードがリストされる点に注意してください。これは、そのアクションが実際に適用されるオブジェクトとは限らない可能性があります。そのため、自由入力も可能にしており、実際の検索は実行時に p_owner に対して行われます。
役に立てば幸いです!
ご返信ありがとうございます。後ほど、ご提示いただいた方法で試してみます。
