Overview
As games become more complex, situations increase where you want to handle specific types of objects collectively - "send the same command to all enemies," "check if the player's attack hit an 'items' group object."
Godot's Groups feature elegantly addresses these needs. Groups are a very convenient mechanism for tagging nodes with labels like "enemy," "item," "destructible object," then using those tags to find or batch-operate on nodes.
This article explains the basic usage of Godot's group feature and how it enables flexible object management.
What are Groups?
Groups are a tagging system for virtually classifying nodes into collections, independent of scene tree hierarchy. A single node can belong to multiple groups, and groups are shared across the entire project.
Key Benefits of Groups:
- Flexible Classification: Classify objects freely regardless of node type (
CharacterBody2D,Area2D, etc.) or parent-child relationships - Batch Operations: Easily get all nodes in a specific group and call the same method on them
- Loose Coupling: Nodes can interact indirectly through groups without directly knowing each other. This improves code clarity
How to Set Up Groups
There are two ways to add nodes to groups: through the editor and through code.
1. Setting Up in the Editor
The easiest and most common method.
- Select the node you want to add to a group in the scene tree
- Open the "Node" tab next to the Inspector
- Select the "Groups" tab
- Enter a group name (e.g.,
enemies) in the text box and press "Add"

The selected node is now a member of the enemies group.
2. Setting Up in Code
Used when you want to add dynamically generated nodes to groups.
func _ready():
# Add this node to the "bullets" group
add_to_group("bullets")
# Can also remove from group
func _on_hit_target():
remove_from_group("bullets")
Group Usage Examples
The true value of groups lies in how you use them from scripts.
Example 1: Get Nodes in a Specific Group
The SceneTree object (obtained via get_tree()) has convenient methods for manipulating groups.
# Get all nodes in the "enemies" group in the scene
func _ready():
var all_enemies = get_tree().get_nodes_in_group("enemies")
for enemy in all_enemies:
print(enemy.name)
Example 2: Broadcast Commands to All Nodes in a Group
Using SceneTree's call_group() method, you can call a specific function on all nodes in a particular group at once. For example, pausing all enemy characters when a boss appears.
# Boss.gd
func _on_boss_appeared():
# Call the "pause_movement" method on all nodes in "enemies" group
get_tree().call_group("enemies", "pause_movement")
# Enemy.gd
func pause_movement():
# Processing to stop movement
set_physics_process(false)
Example 3: Use in Collision Detection
Combined with Area2D's body_entered signal, you can easily check if a collided object belongs to a specific group.
# Player.gd
func _on_body_entered(body):
# Check if collided object is in "enemies" group
if body.is_in_group("enemies"):
take_damage()
# Check if collided object is in "items" group
if body.is_in_group("items"):
body.collect() # Call item's collection process
This eliminates the need for inflexible code like if body.name == "Slime" or body.name == "Goblin" ....
Summary
The group feature is a powerful weapon for writing organized, extensible code in Godot. The simple concept of tagging objects and using those tags to find and operate on them has a very wide range of applications.
- Classify by roles like enemies and items
- Gather objects you want to batch operate on
- Identify the other party's type in collision detection
When you encounter these situations, consider using the group feature. Your project will become cleaner and easier to manage.