问题描述
我在几个不同的父节点下有几个节点。每个子节点都继承自一个基本脚本,因为它们都具有相同的功能,只是各个变量值不同。在“_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() == something
或if node.get_parent().name == something
检查父节点。 我提醒你get_children
。