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;