微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GODOT add_to_group 带有继承变量

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。