Unity:Tilemap 使いかた、クリックなどメモ

Tilemap は 2DObject から作れる。

Tilemap を塗るためには Sprite を asset 形式にする必要がある。

Sprite を Tilemap 用にするために TilePalette ウィンドウを使うのが楽。

TilePalette がない場合は新しく作る。

画面下の TilePalette に Sprite をドラッグアンドドロップすると保存先とかいろいろ設定するようにエクスプローラーがでてくる。

スクリプトで使いたい場合は正直 TilePalette の設定はあんまり気にしなくていいけど アセット化は必要。アセット化しても元の Sprite が消えるわけではない。

アセット化した Sprite は TilePalette でマウスのアイコンを選択した状態で適当な場所を選ぶと設定できる。

設定した Sprite を選んだあと、真ん中あたりのブラシマークを選んで、上側のグリッドを適当にクリックすると Spriteを Tilemap に塗ることができる。

TilePalette に当たり判定を付けたい場合は Tilemap オブジェクトのコンポーネントに Tilemap Collider 2D を追加。

TilePalette で塗る Sprite ごとに当たり判定を変えたい場合は、Asset フォルダの下のどこかに作った Sprite のアセットを見て、ColliderType を変更する。

None を選択するとその画像は当たり判定がなくなる。

Sprite を選択するとその画像の透過部分は当たり判定がなくなり塗ってある部分は当たり判定がつくようになる。

Grid を選択するとその画像で塗ったマスはまるまる当たり判定がつくようになる。

 

Sprite を Multiple にして Grid By Cell Size で Slice したものを使っている場合 Sprite の大きさがマスの大きさにあわないときは 元の全体 Sprite の PixelsPerUnit を Grid By Cell Size で設定した大きさと同じにするといい感じにマスに収まるかも?

スクリプトでつかえそうなもの

using namespace UnityEngine.Tilemaps;

を忘れない。
TileBase は Sprite からつくられたアセットを選択。
SetTile は Tilemap の座標の位置を選択した TileBase で塗る関数。

 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;

public class TileTest : MonoBehaviour
{
    public Tilemap Tilemap;
    public TileBase Wall;
    // Start is called before the first frame update
    void Start()
    {
        for(int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                Tilemap.SetTile(new Vector3Int(i, j, 0), Wall);
            }
        }
    }
}

タイルをクリックしてなにか処理したいとき。
今回だとクリックした部分が Wall じゃない場合は Wall にする。

        void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                Vector3 mousePosition = Input.mousePosition;
                Vector3 screenToWorldPoint = Camera.main.ScreenToWorldPoint(mousePosition);
                WallBreak(screenToWorldPoint);
                Vector3Int clickedpos = TileMap.WorldToCell(screenToWorldPoint);
                if (TileMap.GetTile(clickedpos) != Wall)
                {
                    TileMap.SetTile(clickedpos, Wall);
                }
            }
        }

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA