This is the shortest supported path from a fresh install to one successful placement.
Requirements: Grid Placement 6.0, Godot 4.5.x minimum, GDScript.
The beginner path uses 2D TileMapLayer object placement because it has the fewest moving parts. 3D GridMap GRID/SMOOTH placement is also supported; once the runtime model makes sense, use 3D Object Placement.
1. Install
- Copy
addons/grid_placementinto your project. - Copy
templates/grid_placement_templatesif you want the starter scenes/UI. - Enable Grid Placement in Project Settings → Plugins.
- Run Project → Tools → Grid Placement / Setup Default Input Actions.
- Restart the editor.
Confirm the placement actions appear in Project Settings → Input Map.
2. Understand the minimum runtime
GridPlacementHost
└─ PlacementSession
Level
└─ PlacementLevelContext
Player/controller
└─ PlacementOwner| Piece | Purpose |
|---|---|
GridPlacementHost |
Runtime coordinator and session registry. |
PlacementSession |
Per-player/per-controller selection, targeting, settings, and interaction state. |
PlacementLevelContext |
Connects the active level surface and placed-object parent. |
PlacementOwner |
Identifies who owns the placement interaction. |
GridPositioner2D |
Tracks the current 2D grid target for human input. |
The shipped starter systems scene already wires most of this. Use it for the first pass unless you specifically need manual composition.
3. Connect the 2D level
Add/configure PlacementLevelContext in the level:
| Field | Assign |
|---|---|
target_map |
The TileMapLayer used for grid targeting. |
objects_parent |
The Node2D that receives committed scene objects. |
These are different responsibilities: the map defines the grid surface; the object parent owns placed scene instances.
4. Connect the player/controller
Add PlacementOwner and assign owner_root to the player/controller root.
Use GridPositioner2D for mouse/controller grid targeting. If the starter indicator does not visually match your tile size, adjust its presentation; do not change placement coordinates just to make a cursor graphic line up.
5. Create one placeable
Create a simple object scene, then a ScenePlacementEntry resource that points at it.
For the first object:
- Assign
packed_scene. - Add display metadata only if your selection UI needs it.
- Assign a
PlacementProfileif the object needs category/tool/rule behavior. - Keep custom rules minimal until basic placement works.
If you use collision-based validation/manipulation, configure collision layers/masks deliberately.
6. Select and place it
Use the shipped selection UI or your own consumer to select the entry.
A healthy first placement looks like this:
- Entry becomes active.
- Preview follows the target cell.
- Preview reports valid/blocked state.
- Confirm commits one object under
objects_parent. - No missing-context/configuration errors appear in Output.
If the preview works but commit fails, read the placement failure/report before changing code. Common causes are missing context, occupancy, rules, or collision masks.
7. Add features one at a time
After one object works, add only the feature you need next:
- 2D terrain painting:
SINGLE, then LINE/rectangle/flood brushes. - Object LINE placement: enable it through the entry/profile that should support it.
- Manipulation: move/rotate/flip/demolish supported objects.
- Persistence: save → restore → continue.
- Custom rules/world facts: connect game-owned restrictions.
- Multiple sessions: split-screen/multiplayer/controller-specific state.
- 3D GRID: cell-aligned structures and CELL/EDGE/FACE mounts.
- 3D SMOOTH: free world-space placement and optional sockets.
- 3D slope/support: configure support tolerance for GRID structures.
Do not add all of these just because they exist.
2D terrain vs 3D terrain
Terrain painting in 6.0 means 2D TileMapLayer terrain painting.
3D GridMap terrain editing/painting is not a supported 6.0 feature. 3D slope/support settings validate where objects may sit; they do not modify terrain.
Common first-run failures
- Plugin not enabled.
- Default input actions not installed.
- Session not registered/configured.
PlacementLevelContext.target_maporobjects_parentmissing.PlacementOwner.owner_rootmissing.- Positioner not connected to the active interaction.
- UI
Controlconsuming clicks intended for placement. - Collision layers/masks inconsistent with targeting or validation.
See Troubleshooting before building a workaround.