Cooooding!!

Unity(C#)を使ったゲーム開発関連Tipsなど

Tilemapの情報をスクリプトから取得する【Unity】

概要

Tilemapの情報をスクリプトで取得して処理したかったので取得方法を調べてみました。

取得方法

タイルがどこに存在するかを取得する

タイルが存在する範囲はTilemap.cellBoundsで知ることができます。この範囲のセルに対してTilemap.HasTileを使うことでどのセルにタイルが存在するかを取得できます。

実装例:

public static void OutputPosition(Tilemap tilemap)
{
    var builder = new StringBuilder();
    var bound = tilemap.cellBounds;
    for (int y = bound.max.y - 1; y >= bound.min.y; --y)
    {
        for (int x = bound.min.x; x < bound.max.x; ++x)
        {
            builder.Append(tilemap.HasTile(new Vector3Int(x, y, 0)) ? "■" : "□");
        }
        builder.Append("\n");
    }
    Debug.Log(builder.ToString());
}

出力例:
f:id:nyama41:20190622221507p:plain

cellBoundsの外側にタイルを置くと自動的にこの範囲は拡張されますが、そのタイルを消しても自動的に縮小されることはありません。縮小したい場合はTilemap.CompressBoundsを使って縮小できます。

タイルにどのSpriteが設定されているかを取得する

タイルにどのSpriteが設定されているか知りたいときはTilemap.GetTile<Tile>を使ってTile型の値を取得しTile.spriteをチェックします。

実装例:

public static void OutputSpriteType(Tilemap tilemap)
{
    // 使われているSpriteをリストアップ
    var bound = tilemap.cellBounds;
    var spriteList = new List<Sprite>();
    for (int y = bound.max.y - 1; y >= bound.min.y; --y)
    {
        for (int x = bound.min.x; x < bound.max.x; ++x)
        {
            var tile = tilemap.GetTile<Tile>(new Vector3Int(x, y, 0));
            if (tile != null && !spriteList.Contains(tile.sprite))
            {
                spriteList.Add(tile.sprite);
            }
        }
    }
    // どの場所でそのSpriteが使われているかを出力
    var builder = new StringBuilder();
    for (int y = bound.max.y - 1; y >= bound.min.y; --y)
    {
        for (int x = bound.min.x; x < bound.max.x; ++x)
        {
            var tile = tilemap.GetTile<Tile>(new Vector3Int(x, y, 0));
            if (tile == null)
            {
                builder.Append("_");
            }
            else
            {
                var index = spriteList.IndexOf(tile.sprite);
                builder.Append(index);
            }
        }
        builder.Append("\n");
    }
    Debug.Log(builder.ToString());
}

出力例:
f:id:nyama41:20190622221524p:plain

特定のタイルがある範囲を取得する

特定のタイルがある範囲を取得したい場合はGetTileは使わずにTilemap.GetCellCenterLocalTilemap.originなどを使って範囲を取得します。
実装:

public static Rect OutputTilePosition(Tilemap tilemap, int x, int y)
{
    var rect = new Rect();
    rect.center = tilemap.GetCellCenterLocal(new Vector3Int(x, y, 0)) + tilemap.origin;
    rect.size = tilemap.cellSize;
    return rect;
}

環境

  • Unity 2018.4.2f1
  • VisualStudio 2019