Overview
As Godot game development progresses, you'll want to define complex collision rules like "players can't pass through walls," "enemies shouldn't collide with each other," "only the player can collect coins." Trying to manage these with if statements alone quickly turns your code into a complex mess.
The elegant solution to this problem is Collision Layers and Collision Masks built into Godot's physics engine.
This article clearly explains these two concepts that many beginners struggle with, using diagrams to help organize your game's collision detection.
Layers and Masks: The Concept of Role Division
Looking at the Inspector for a CollisionObject (Area2D, CharacterBody2D, RigidBody2D, etc.), you'll find Layer and Mask items in the Collision section. These two have distinct roles.
- Layer: A declaration of "I am here". Shows which physics layer the object exists on.
- Mask: A declaration of "I want to collide with this". Shows which layer objects the object will detect.
How to remember: Think of Layer as "your nametag" and Mask as "the nametags you're looking for."
For a collision to occur, both objects' Layers and Masks must match. That is, for Object A to collide with Object B, both of the following conditions must be met:
- Object A's Mask includes Object B's Layer
- Object B's Mask includes Object A's Layer
Configuration Methods and Naming
Layers and Masks are represented as 32 toggleable checkboxes each. However, remembering "layer 1" "layer 2" is difficult.
Therefore, naming each layer in Project Settings is extremely important.
- Open "Project" → "Project Settings"
- From the left tree, select "Layer Names" → "2D Physics" or "3D Physics"
- Give each layer descriptive names like "player", "enemy", "world", "item"

This way, names appear on the Inspector checkboxes, dramatically reducing configuration errors.
Practical Example: Specific Settings
Let's look at specific settings using common game objects as examples.
| Object | Layer (I am here) | Mask (I want to collide with) |
|---|---|---|
| Player | player | world, enemy, item |
| Enemy | enemy | world, player |
| World (walls/floors) | world | player, enemy |
| Item (coins) | item | player |
This configuration achieves the following behavior:
- Player: Collides with walls, enemies, and items
- Enemy: Collides with walls and player, but not with other enemies or items (passes through)
- World: Collides with player and enemies, but not with items (to prevent items from getting stuck in walls)
- Item: Only collides (pickup detection) with player. Passes through walls and enemies
Using Area2D, you can detect "entry" without collision. For example, create an enemy's attack range with Area2D and only monitor the player layer with its Mask.
Summary
Collision Layers and Masks may seem complex at first glance, but once you understand their role division ("I am here" and "I'm looking for you"), they become a very powerful tool.
Mastering this feature lets you keep collision processing code in move_and_slide() simple, managing object interactions declaratively and intuitively. The benefits are immeasurable as your game grows larger.
Start by naming your layers in Project Settings, and try organizing your collision detection.