タイルマップ:タイルを検出する
課題
CharacterBody2DキャラクターがTileMapと衝突しており、どのタイルに衝突したのかを確認したい場合。
解決策
オブジェクト同士が衝突した場合、衝突データは KinematicCollision2D オブジェクトとして取得されます。 TileMap は単一のコリダーとして機能するため、collider プロパティを参照すると実際にはこの TileMap ノードが返される点にご注意ください。
その後、衝突位置にあるTileMapのタイルを特定が必要です。
以下の状況を想定してください。変数 collision に KinematicCollision2D オブジェクトが格納されている場合:
# Confirm the colliding body is a TileMap
if collision.collider is TileMap:
# Find the character's position in tile coordinates
var tile_pos = collision.collider.world_to_map(position)
# Find the colliding tile position
tile_pos -= collision.normal
# Get the tile id
var tile_id = collision.collider.get_cellv(tile_pos)
tile_idを取得した後、TileSetリソースからタイルのプロパティを取得できます。これはTileMapオブジェクトのtile_setプロパティで参照できます。例えば、特定のタイル名を取得するには以下のようにします。
var tile_name = collision.collider.tile_set.tile_get_name(tile_id)
また、新しいidを設定することでタイルを変更することもできます。
collision.collider.set_cellv(tile_pos, new_id)