Isometric Z As Yでクリックしたセルの座標を正しく取得する方法

Unity

やりたいことは以下です

段差のあるTilemapでクリックしたセルの座標を正しく取得したいです!

どうすれば出来るか記載していきます!

(基本的にスクリプトで座標を取得することになります)

以下サイトの内容を参考にさせていただきました!

Clicking On Tiles With An Isometric Z As Y Tilemap?
I can't seem to register what tile is being clicked on with a z as y tilemap. Using WorldToCell and GetTile gives me the...

まずは段差のあるTilemapを作ろう!

最初に段差のあるTilemapを作成しないとなのですが

別で記載していますので以下をご確認ください!

段差のあるTilemapのセルの座標を取得するスクリプト全容

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

public class TilemapInfo : MonoBehaviour
{
    private int zMax;

    [SerializeField]
    private Tilemap tilemap;

    [SerializeField]
    private TileBase tile;

    // Start is called before the first frame update
    void Start()
    {
        zMax = tilemap.cellBounds.zMax;
        Debug.Log("zMax = " + zMax);

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            GetTopCell();

        }

    }

    // Z座標が高いセルの情報を取得します
    public Vector3Int GetTopCell()
    {
        Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

        //Iterate through tile layers starting at the top
        for (int i = zMax; i >= 0; i--)
        {
            Vector3 v = new Vector3(mousePos.x, mousePos.y, i);
            //check cell
            cell = tilemap.WorldToCell(v);
            if (tilemap.HasTile(cell))
            {
                tilemap.SetTile(cell, tile);
                break;
            }
        }

        return cell;
    }
}

ポイント1:全セルの最大のZ座標を取得する

最初のポイントは以下Start関数での処理です

    void Start()
    {
        zMax = tilemap.cellBounds.zMax;
    }

tilemap.cellBounds.zMaxでTilemap上の全てのセルの中で

最大のZ座標を取得しています

ポイント2:マウスクリックでGetTopCell()を呼び出す

続いてUpdate関数内でマウス左クリック時に

GetTopCell()を呼び出しています

このGetTopCell()が段差のセルの座標を取得する処理の本体です

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            GetTopCell();

        }

    }

ポイント3:マウスのセル座標を取得する

以下の部分でマウスのワールド座標(Vector2型)を取得しています

Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

その後のfor文でStart時に取得したTilemapの最大のZ座標から0までループしています

 for (int i = zMax; i >= 0; i--)

でfor文でループすることによって

以下でマウスのx座標,y座標は固定して

iでz座標を高い位置から低い位置に変更していって

Vector3の変数を設定しています

Vector3 v = new Vector3(mousePos.x, mousePos.y, i);

このVector3の変数から以下で更にTilemapのセル座標に変換しています

cell = tilemap.WorldToCell(v);

最後に以下でセル座標にセルが存在しているか確認し

存在していればそのセルを別のセルに置き換えています

            if (tilemap.HasTile(cell))
            {
                tilemap.SetTile(cell, tile);
                break;
            }

解説おわり!

簡単に説明する形ですが

これでZ座標も考慮してマウスのクリックしたセル座標を

取得することができます!

タイトルとURLをコピーしました