Einführung
Godot 4 hat das TileMap-System komplett neu geschrieben. Wenn du TileMap in Godot 3 verwendet hast, hat sich fast alles geändert — der TileSet-Editor, wie Kacheln definiert werden, Auto-Tiling, Ebenen und die GDScript-API. Dieser Leitfaden erklärt die neue Architektur von Grund auf.
Godot-3-Nutzer: Die alten autotile, set_cellv() und cell_size sind alle verschwunden. Siehe den Abschnitt Migration von Godot 3 am Ende der Seite.
Die neue TileMap-Architektur
Das TileMap-System von Godot 4 besteht aus zwei Hauptkomponenten:
- TileMap-Node — Der Node, den du deiner Szene hinzufügst. Er enthält eine oder mehrere Ebenen und referenziert eine TileSet-Ressource.
- TileSet-Ressource — Definiert die Kacheln selbst. Enthält Quellen (Atlas, Szenensammlung usw.), Physik-Ebenen, Navigations-Ebenen, benutzerdefinierte Datenebenen und Terrain-Sets.
Wichtige Änderung: In Godot 3 wurde die Kachelgröße am TileMap-Node festgelegt. In Godot 4 wird die Kachelgröße in der TileSet-Ressource definiert, und die TileMap referenziert sie nur.
TileSet-Quellen
Ein TileSet kann mehrere Quellen haben, die jeweils durch eine source_id (Ganzzahl) identifiziert werden. Zu den Quellentypen gehören:
- TileSetAtlasSource — Der häufigste Typ. Ein einzelnes Texturbild, das mehrere in einem Raster angeordnete Kacheln enthält.
- TileSetScenesCollectionSource — Jede Kachel ist eine gepackte Szene, nützlich für animierte oder interaktive Kacheln.
Ein TileSet einrichten
Schritt 1: Die TileSet-Ressource erstellen
- Füge deiner Szene einen TileMap-Node hinzu.
- Klicke im Inspektor auf die Eigenschaft Tile Set und wähle New TileSet.
- Lege die Tile Size fest (z. B. 16x16 oder 32x32).
Schritt 2: Eine Atlas-Quelle hinzufügen
- Klicke auf das TileSet, um den TileSet-Editor im unteren Panel zu öffnen.
- Klicke auf die Schaltfläche + und wähle Atlas.
- Ziehe dein Tileset-Bild in die Eigenschaft Texture.
- Der Editor teilt es automatisch anhand deiner Kachelgröße in Kacheln auf. Du kannst die Texturregion und die Ränder anpassen.
Schritt 3: Kacheleigenschaften konfigurieren
Im TileSet-Editor kannst du verschiedene Ebenentypen hinzufügen, die für alle Kacheln gelten:
- Physics Layers — Kollisionsformen für Kacheln
- Navigation Layers — Begehbare Polygone für Wegfindung
- Custom Data Layers — Beliebige typisierte Daten (bool, int, float, String usw.)
- Terrain Sets — Für Auto-Tiling (der Ersatz für Godot 3 autotile)
TileMap-Ebenen
Ein einzelner TileMap-Node kann mehrere Ebenen enthalten. Das ist eine große Verbesserung gegenüber Godot 3, wo du separate TileMap-Nodes für Hintergrund und Vordergrund brauchtest. Jede Ebene kann ihre eigenen z-index-, y-sort- und modulate-Einstellungen haben.
Übliche Ebenen-Konfiguration:
- Layer 0 — Hintergrund (Boden, Fußboden) — z-index: -1
- Layer 1 — Terrain (Wände, Hindernisse) — z-index: 0
- Layer 2 — Vordergrund (Dekoration über dem Spieler) — z-index: 1
GDScript-API für Ebenen
# Set a cell on layer 0
tilemap.set_cell(0, Vector2i(5, 3), source_id, atlas_coords)
# Get cell info
var source = tilemap.get_cell_source_id(0, Vector2i(5, 3))
var coords = tilemap.get_cell_atlas_coords(0, Vector2i(5, 3))
# Erase a cell
tilemap.erase_cell(0, Vector2i(5, 3))
# Check if a cell is occupied
if tilemap.get_cell_source_id(0, Vector2i(5, 3)) != -1:
print("Cell has a tile")
API-Hinweis: Der erste Parameter in set_cell() ist immer der Ebenenindex (0, 1, 2...). Der zweite ist die Zellposition als Vector2i. Der dritte ist die source_id, und der vierte sind die atlas_coords als Vector2i.
Terrain-System (Auto-Tiling)
Das Terrain-System ersetzt das autotile von Godot 3. Es wählt automatisch die richtige Kachelvariante basierend auf den benachbarten Kacheln aus.
Terrains einrichten
- Füge in TileSet ein Terrain Set hinzu (Inspektor → Terrain Sets → Add Element).
- Wähle den Terrain-Modus: Match Corners and Sides (47 Kacheln), Match Corners (16 Kacheln) oder Match Sides (16 Kacheln).
- Füge Terrain-Typen innerhalb des Sets hinzu (z. B. „Grass", „Dirt", „Water").
- Wechsle im TileSet-Editor in den Select-Modus, wähle eine Kachel aus und male die Terrain-Peering-Bits auf jede Kachel.
Terrains malen
Sobald die Terrains konfiguriert sind, wechsle zum TileMap-Editor und wähle den Tab Terrains. Wähle deinen Terrain-Typ und male direkt auf die Karte. Godot wählt automatisch die richtige Kachelvariante aus.
# Set terrain programmatically
tilemap.set_cells_terrain_connect(0, [Vector2i(5, 3)], 0, 0)
# Parameters: layer, cells array, terrain_set, terrain index
Physik auf Kacheln
Um Kollision zu Kacheln hinzuzufügen:
- Füge im TileSet-Inspektor eine Physics Layer hinzu.
- Konfiguriere, welche Kollisions-Layer und -Maske diese Physik-Ebene verwendet.
- Wechsle im TileSet-Editor zum Tab Physics und zeichne Kollisionspolygone auf jede Kachel.
Tipp: Du kannst mehrere Physik-Ebenen für verschiedene Kacheltypen haben. Zum Beispiel eine Ebene für Wände (blockiert Bewegung) und eine andere für Gefahren (löst Schaden über Area2D-Überlappung aus).
Benutzerdefinierte Daten auf Kacheln
Benutzerdefinierte Datenebenen ermöglichen es dir, typisierte Metadaten an jede Kachel anzuhängen. Das ist für Gameplay-Logik äußerst nützlich.
Benutzerdefinierte Daten einrichten
- Füge im TileSet-Inspektor eine Custom Data Layer hinzu.
-
Benenne sie (z. B. „is_destructible") und lege den Typ fest (z. B.
bool). - Wechsle im TileSet-Editor zum Tab Custom Data und setze Werte pro Kachel.
Benutzerdefinierte Daten im Code auslesen
var tile_data = tilemap.get_cell_tile_data(0, Vector2i(5, 3))
if tile_data:
var is_destructible = tile_data.get_custom_data("is_destructible")
var damage = tile_data.get_custom_data("damage")
if is_destructible:
destroy_tile(Vector2i(5, 3))
Häufige Beispiele für benutzerdefinierte Daten:
is_destructible: booldamage: intmovement_cost: floattile_type: String(z. B. "water", "lava", "ice")spawn_chance: float
Prozedurale Kachelplatzierung
Das programmatische Platzieren von Kacheln ist mit der neuen API unkompliziert:
# Fill a rectangular area
for x in range(20):
for y in range(10):
tilemap.set_cell(0, Vector2i(x, y), 0, Vector2i(0, 0))
# Random tile placement
for x in range(50):
for y in range(50):
if randf() > 0.7:
tilemap.set_cell(0, Vector2i(x, y), 0, Vector2i(1, 0))
else:
tilemap.set_cell(0, Vector2i(x, y), 0, Vector2i(0, 0))
# Get all used cells on a layer
var used_cells: Array[Vector2i] = tilemap.get_used_cells(0)
print("Layer 0 has ", used_cells.size(), " tiles")
# Clear all tiles on a layer
tilemap.clear_layer(0)
# Clear everything
tilemap.clear()
Umrechnung von Welt- zu Kartenkoordinaten
# Convert world position to map coordinates
var map_pos: Vector2i = tilemap.local_to_map(world_position)
# Convert map coordinates to world position (center of tile)
var world_pos: Vector2 = tilemap.map_to_local(Vector2i(5, 3))
# Example: check what tile the player is standing on
var player_tile = tilemap.local_to_map(tilemap.to_local(player.global_position))
var tile_data = tilemap.get_cell_tile_data(0, player_tile)
if tile_data:
var tile_type = tile_data.get_custom_data("tile_type")
print("Player is on: ", tile_type)
Migration von Godot 3
| Godot 3 | Godot 4 |
|---|---|
TileMap.cell_size |
TileSet.tile_size |
set_cellv(pos, tile_id) |
set_cell(layer, pos, source_id, atlas_coords) |
get_cellv(pos) |
get_cell_source_id(layer, pos) |
autotile |
Terrain-System (Terrain Sets) |
| Eine Ebene pro TileMap-Node | Mehrere Ebenen in einer TileMap |
TileMap.tile_set = preload(...) |
TileSet-Ressource wird im Inspektor oder per Code zugewiesen |
world_to_map() |
local_to_map() |
map_to_world() |
map_to_local() |
Häufige Fehler
-
Vergessen, zuerst ein TileSet zu erstellen. Der TileMap-Node zeigt den Kacheleditor erst an, wenn du eine TileSet-Ressource zuweist. Erstelle eine im Inspektor.
-
Falsche source_id. Wenn du nur eine Atlas-Quelle hast, ist ihre
source_idgleich0. Das Hinzufügen einer zweiten Quelle gibt ihrsource_id = 1. Prüfe das untere Panel des TileSet-Editors — jeder Quellen-Tab zeigt seine ID an. -
atlas_coords mit Kachel-IDs verwechseln. In Godot 4 gibt es keine einfachen Kachel-IDs. Stattdessen referenzierst du Kacheln über ihre Position im Atlas-Raster als
Vector2i(column, row). -
Den Ebenen-Parameter nicht angeben. Jede Zelloperation benötigt einen Ebenenindex als erstes Argument. Ihn zu vergessen verursacht Argumentfehler.
-
set_cellv()verwenden. Diese Methode existiert nicht mehr. Verwendeset_cell()mit der neuen Signatur.