Things About Physics

Some random things about physics in Godot

Physics bodies vs. Areas

StaticBody2D, RigidBody2D, and CharacterBody2D and theird 3D equivalents StaticBody3D, RigidBody3D, and CharacterBody3D are physics bodies. They are used to detect collisions and apply forces to other bodies.

Area2D and Area3D are used to detect overlappings.

Difference is that when physics bodies detects collision they do give you options to determine what to do with information about collision. By default for CharacterBody you can use move_and_sllide and it automatically detects collisions and reacts to them, like stopping when hitting wall or sliding down.

Area2D and Area3D are used to detect overlappings. They don’t give you any information about collision, they just tell you that something is overlapping with them. You can use them to detect when player is in range of enemy or when player is in range of item to pick up.

Warning

Do not nest physics bodies inside of each other. This can cause unexpected behavior.

Physics layers and masks

This is the most confusing part of physics in Godot.

Layers and masks are used to determine how physics bodies interact with each other. You can set layers and masks only for each physics body, not for shapes.

Layers tells in Godot which layers physics body belongs to. You can set up to 32 layers.

Masks tells in Godot which layers physics body can collide with. In other words which layers it can interact with. You can set up to 32 masks.

For example if your game has 4 physics objects Player, Enemy, Bullet, and Fence. You want Player to collide with Enemy and Fence but not with Bullet. You want Enemy to collide with Player, Fence and bullet but not with other Enemy. You want Bullet to collide with only Enemy, not with Player or Fence. Fence doesn’t need to collide with anything.

You can set up layers and masks like this: Player layer 1, masks 2 and 4 Enemy layer 2, masks 1, 3, and 4 Bullet layer 3, masks 2 Fence layer 4, masks 0

Tip

You can name collision layers in Project Settings -> Layer Names