GODOT add_to_group 带有继承变量

GODOT add_to_group with an inheritance variable

我在几个不同的父节点下有几个节点。每个子节点都继承自基本脚本,因为它们都具有相同的功能,只是不同的变量值。在“_ready”上,我希望每个节点都将自己添加到以其父节点命名的组中。

Base.gd:

extends Area2D

export var _parent: String

func _ready() -> void:
     add_to_group(_parent)

Node1.gd

extends "res://Base.gd"

func _ready() -> void:
     _parent = "MyParentNode"

这似乎应该将 Node1 添加到“MyParentNode”组中。我也收到此调试错误:

add_to_group: 条件“!p_identifier.operator String().length()”为真。

Godot 将首先递归地在基础 class 上调用 _ready。我详细介绍了 Godot 如何在 my answer to How to know if an overriden method calls its super method or not?

中调用 _ready

因此,戈多会这样称呼:

func _ready() -> void:
     add_to_group(_parent)

然后是这个:

func _ready() -> void:
     _parent = "MyParentNode"

因此调用add_to_group时没有设置_parent


现在,如果你想设置一个变量,我建议使用 setget:

extends Area2D

export var _parent:String setget ser_parent

func set_parent(new_value:String) -> void:
    if _parent == new_value:
        return

    if is_in_group(_parent):
        remove_from_group(_parent)

    add_to_group(new_value)
    _parent = new_value

这样,每次派生 class 设置 _parent,它都会相应地从组中添加和删除节点。


顺便说一句,以防万一,如果您只打算将此用于 is_in_group,那么您根本不需要群组。您可以检查 if node._parent == something.

而不是检查 if node.is_in_group(something)

此外,如果这是父节点的谓词,则可以用get_parent()检查父节点:if node.get_parent() == somethingif node.get_parent().name == something我提醒你 get_children