我刚开始习惯使用Unity的新tilemap工具(UnityEngine.Tilemaps)。
我遇到的一个问题是我不知道如何通过脚本获取放置的图块的x,y坐标。我试图将脚本中的tilemap上的scriptableObject移动到玩家点击的新位置,但我不知道如何获取点击的tile位置的坐标。 Tile类似乎没有任何位置属性(Tile对其位置一无所知),因此Tilemap必须有答案。我无法在Unity文档中找到有关如何获取Tilemap中所选图块的Vector3坐标的任何内容。
答案 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静态对象,然后获取它的位置。