关于自定义动作指定路径

这个AGMPluginAction不继承自Node类型,要如何指定特定节点?
目前好像只能@export var sprite_path: NodePath = NodePath()来指定

有几种方法可以尝试:

  1. 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"
  1. 可点击列表

你可以构建自己的下拉菜单,而不依赖 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 进行。

希望这能帮到你!

感谢回复,我后续会实验下您提供的办法