GODOT add_to_group 带有继承变量

问题描述

我在几个不同的父节点下有几个节点。每个子节点都继承自一个基本脚本,因为它们都具有相同的功能,只是各个变量值不同。在“_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 将首先在基类上递归调用 _ready。我详细介绍了 Godot 如何在 my answer to How to know if an overriden method calls its super method or not?

中调用 _ready

因此,Godot 会这样称呼它:

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

然后这个:

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

因此,在调用 _parent 时未设置 add_to_group


现在,鉴于您要设置变量,我建议使用 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

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


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

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