Unity Tilemap:如何通过脚本获取瓦片的X、Y坐标位置?
解决Unity Tilemap获取瓦片坐标的问题
嘿,刚用Tilemap遇到这个问题太正常了!毕竟Tile本身是可复用的资源,它确实不会存储自己在Tilemap里的位置——位置信息是存在Tilemap的格子数据里的,咱们得通过Tilemap的API来转换坐标,我给你一步步讲清楚:
核心思路
你需要把鼠标点击的世界坐标转换成Tilemap的格子坐标(Vector3Int),这个坐标就是瓦片所在的X、Y位置(Z轴通常为0,多层Tilemap才会用到)。之后还能把格子坐标转回世界坐标,用来移动你的对象。
具体步骤 & 示例代码
下面是一个完整的脚本示例,你可以直接参考:
using UnityEngine; using UnityEngine.Tilemaps; public class TilemapClickHandler : MonoBehaviour { public Tilemap targetTilemap; // 拖拽你的Tilemap到这个字段 public GameObject objectToMove; // 你要移动的对象(如果是操作ScriptableObject,换成对应引用即可) void Update() { // 检测鼠标左键点击 if (Input.GetMouseButtonDown(0)) { // 1. 获取鼠标点击的世界坐标 Vector3 worldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); // 2D Tilemap要对齐Z轴,避免坐标偏差 worldPos.z = targetTilemap.transform.position.z; // 3. 转换为Tilemap的格子坐标(这就是瓦片的X/Y整数坐标) Vector3Int cellPos = targetTilemap.WorldToCell(worldPos); // 4. 先判断这个格子里有没有瓦片,避免空操作 if (targetTilemap.HasTile(cellPos)) { Debug.Log($"点击的瓦片坐标:X={cellPos.x}, Y={cellPos.y}"); // 如果要把对象移动到瓦片中心位置,把格子坐标转回世界坐标 Vector3 tileWorldCenter = targetTilemap.CellToWorld(cellPos) + targetTilemap.cellSize / 2; objectToMove.transform.position = tileWorldCenter; // 如果是操作ScriptableObject,比如记录它的位置,直接用cellPos即可 // 示例:yourScriptableObject.tilePosition = cellPos; } } } }
关键API解释
tilemap.WorldToCell(Vector3 worldPos):把世界坐标转换成Tilemap的格子坐标,返回的Vector3Int就是瓦片所在的整数位置tilemap.HasTile(Vector3Int cellPos):检查指定格子里是否存在瓦片,避免空操作tilemap.CellToWorld(Vector3Int cellPos):把格子坐标转回世界坐标,注意这个方法返回的是格子的左下角,所以要加上cellSize/2才能得到瓦片中心位置
补充说明
为什么Tile本身没有位置属性?因为一个Tile资源可以被重复放置在Tilemap的多个格子里,它是“模板”一样的存在,不绑定具体位置——所有位置信息都由Tilemap来管理,所以必须通过Tilemap的坐标转换API来获取。
内容的提问来源于stack exchange,提问作者jeffrey
相关产品推荐
相关产品推荐

