タイルマップ:タイルを検出する

課題

CharacterBody2DキャラクターがTileMapと衝突しており、どのタイルに衝突したのかを確認したい場合。

解決策

オブジェクト同士が衝突した場合、衝突データは KinematicCollision2D オブジェクトとして取得されます。 TileMap は単一のコリダーとして機能するため、collider プロパティを参照すると実際にはこの TileMap ノードが返される点にご注意ください。

その後、衝突位置にあるTileMapのタイルを特定が必要です。

以下の状況を想定してください。変数 collisionKinematicCollision2D オブジェクトが格納されている場合:

# 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)

関連レシピ

この動画が気に入ったら?