diff --git a/doc/classes/SceneTree.xml b/doc/classes/SceneTree.xml index 8b4e8becb34..e1da3977307 100644 --- a/doc/classes/SceneTree.xml +++ b/doc/classes/SceneTree.xml @@ -80,6 +80,13 @@ Creates and returns a new [SceneTreeTween]. + + + + + Returns the first node in the specified group, or [code]null[/code] if the group is empty or does not exist. + + diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index e7a85c44929..5562216fa8f 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -1228,6 +1228,21 @@ Array SceneTree::_get_nodes_in_group(const StringName &p_group) { return ret; } +Node *SceneTree::_get_first_node_in_group(const StringName &p_group) { + Map::Element *E = group_map.find(p_group); + if (!E) { + return nullptr; // No group. + } + + _update_group_order(E->get()); // Update order just in case. + + if (E->get().nodes.empty()) { + return nullptr; + } + + return E->get().nodes[0]; +} + bool SceneTree::has_group(const StringName &p_identifier) const { return group_map.has(p_identifier); } @@ -2091,6 +2106,7 @@ void SceneTree::_bind_methods() { ClassDB::bind_method(D_METHOD("set_group", "group", "property", "value"), &SceneTree::set_group); ClassDB::bind_method(D_METHOD("get_nodes_in_group", "group"), &SceneTree::_get_nodes_in_group); + ClassDB::bind_method(D_METHOD("get_first_node_in_group", "group"), &SceneTree::_get_first_node_in_group); ClassDB::bind_method(D_METHOD("set_current_scene", "child_node"), &SceneTree::set_current_scene); ClassDB::bind_method(D_METHOD("get_current_scene"), &SceneTree::get_current_scene); diff --git a/scene/main/scene_tree.h b/scene/main/scene_tree.h index ef8e6ccad40..292cdf23ec2 100644 --- a/scene/main/scene_tree.h +++ b/scene/main/scene_tree.h @@ -177,6 +177,7 @@ private: _FORCE_INLINE_ void _update_group_order(Group &g, bool p_use_priority = false); Array _get_nodes_in_group(const StringName &p_group); + Node *_get_first_node_in_group(const StringName &p_group); Node *current_scene;