如何在tilemap中获取切片的x,y坐标位置?

时间:2018-01-16 08:54:01

标签: unity3d

我刚开始习惯使用Unity的新tilemap工具(UnityEngine.Tilemaps)。

我遇到的一个问题是我不知道如何通过脚本获取放置的图块的x,y坐标。我试图将脚本中的tilemap上的scriptableObject移动到玩家点击的新位置,但我不知道如何获取点击的tile位置的坐标。 Tile类似乎没有任何位置属性(Tile对其位置一无所知),因此Tilemap必须有答案。我无法在Unity文档中找到有关如何获取Tilemap中所选图块的Vector3坐标的任何内容。

2 个答案:

答案 0 :(得分:4)

如果您有权访问Tile实例,则可以使用其变换(或点击时的光线投射)获取其世界位置,然后通过您的WorldToCell方法获取平铺坐标Grid组件(请查看documentation)。

修改

Unity似乎没有实例化瓷砖,而只使用一个瓷砖对象来管理该类型的所有瓷砖,我不知道。

要获得正确的位置,您必须自己计算。以下是如果网格位于xy平面且z = 0

时如何在鼠标光标处获取平铺位置的示例
// get the grid by GetComponent or saving it as public field
Grid grid;
// save the camera as public field if you using not the main camera
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// get the collision point of the ray with the z = 0 plane
Vector3 worldPoint = ray.GetPoint(-ray.origin.z / ray.direction.z);
Vector3Int position = grid.WorldToCell(worldPoint);

答案 1 :(得分:2)

我找不到通过鼠标点击获取网格位置的方法,所以我使用了Raycast到Vector3,然后通过Grid组件的WorldToCell方法将其转换为坐标根据Shirotha的建议。这允许我将选定的GameObject移动到新位置。

public class ClickableTile : MonoBehaviour
{
    public NormalTile normalTile;
    public Player selectedUnit;

    private void OnMouseUp()
    {
        // left click - get info from selected tile
        if (Input.GetMouseButtonUp(0))
        {
            // get mouse click's position in 2d plane
            Vector3 pz = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            pz.z = 0;

            // convert mouse click's position to Grid position
            GridLayout gridLayout = transform.parent.GetComponentInParent<GridLayout>();
            Vector3Int cellPosition = gridLayout.WorldToCell(pz);

            // set selectedUnit to clicked location on grid
            selectedUnit.setLocation(cellPosition);
            Debug.Log(cellPosition);
        }
    }
}

另外,我知道如何获取Grid位置,但现在如何查询它。我需要从Grid获取GridSelection静态对象,然后获取它的位置。