ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity - Tile をスクリプトから設置する

初めに

 Tilemap クラスを使うことで、スクリプトから Tile を設置することができます。本記事では、Tile をスクリプトから設置する方法をまとめます。

Tilemap クラス

 Tilemap クラスを使うには、名前空間に次を追加する必要があります。

using UnityEngine.Tilemaps;

 このクラスの関数を使うとき、Tilemap や TileBase を使用します。具体的な説明は下記の Tilemap.SetTile の説明をご覧ください。

docs.unity3d.com

Tilemap.SetTile

 第一引数で指定した position に第二引数で指定した tile を設置します。

public void SetTile (Vector3Int position, Tilemaps.TileBase tile);

(例)

using UnityEngine;
using UnityEngine.Tilemaps;

public class TileScript : MonoBehaviour
{
    public Tilemap tilemap;
    public TileBase tile;

    void Start()
    {
        tilemap.SetTile(Vector3Int.zero, tile);
    }
}

 Tilemap や TileBase は Inspector から取得します。

 Tilemap は Tilemap コンポーネントを持ったオブジェクトから取得しています。TileBase は TilePallete に Sprite を追加したときに、作られる Tile になります。


Tilemap.SetTiles

 複数のタイルを設置するための関数です。第一引数に設置する position を配列で指定します。第二引数は設置するタイルを指定します。
 positionArray と tileArray の長さは同じ必要があります。

public void SetTiles (Vector3Int[] positionArray, TileBase[] tileArray);

(例)

using UnityEngine;
using UnityEngine.Tilemaps;

public class TileScript : MonoBehaviour
{
    public Tilemap tilemap;
    public TileBase[] tiles;

    void Start()
    {
        Vector3Int[] positions = new Vector3Int[tiles.Length];
        int num = 0;
        for (int i = 2; i >= 0; i--)
        {
            for (int j = 0; j < 3; j++)
            {
                positions[num] = new Vector3Int(j, i, 0);
                num++;
            }
        }

        //タイルを設置する
        tilemap.SetTiles(positions, tiles);
    }
}

(実行結果)

Tilemap.GetTile

 指定された位置のタイルを返します。

public Tilemaps.TileBase GetTile (Vector3Int position);

(例)

using UnityEngine;
using UnityEngine.Tilemaps;

public class TileScript : MonoBehaviour
{
    public Tilemap tilemap;
    public TileBase tile;

    void Start()
    {
        tilemap.SetTile(Vector3Int.zero, tile);

        //(0, 0, 0)の位置にあるタイルを取得
        TileBase settedTile = tilemap.GetTile(Vector3Int.zero);
        Debug.Log(settedTile);
    }
}
Tilemap.SetTilesBlock

 第一引数で指定された範囲に第二引数で指定されたタイルを設置します。

public void SetTilesBlock (BoundsInt position, TileBase[] tileArray);
using UnityEngine;
using UnityEngine.Tilemaps;

public class TileScript : MonoBehaviour
{
    public Tilemap tilemap;
    public TileBase tile;

    void Start()
    {
        //BoundsIntで範囲指定
        BoundsInt area = new BoundsInt(-2, -2, 0, 4, 4, 1);
        TileBase[] tiles = new TileBase[area.size.x * area.size.y * area.size.z];  //タイルの個数を定義

        for (int i = 0; i < tiles.Length; i++)
        {
            tiles[i] = tile;
        }

        //範囲内にタイルを設置
        tilemap.SetTilesBlock(area, tiles);
    }
}

最後に

 マップの自動生成をする場合には、スクリプトから Tile を設置する必要があると思います。