如何通过鼠标位置获取指定Tilemap层的TileBase?
解决Tilemap通过鼠标位置获取TileBase的问题
问题核心原因
直接传入Input.mousePosition给GetTile会返回null,是因为GetTile需要的是Grid坐标系下的单元格坐标(Vector3Int),而Input.mousePosition是屏幕像素坐标,两者完全不属于同一坐标体系,必然无法匹配。
修正后的代码实现
// 将鼠标屏幕坐标转换为世界坐标,修正Z值以匹配Tilemap所在平面 Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); mouseWorldPos.z = 0; // 假设你的Tilemap在Z=0平面,可根据实际场景调整 // 转换为Tilemap的单元格坐标 Vector3Int cellPos = groundLayer.WorldToCell(mouseWorldPos); // 获取目标TileBase TileBase tile = groundLayer.GetTile(cellPos); if (tile != null) { Debug.Log(tile.GetType()); // 获取Tile的位置数据 TileData tileData = new TileData(); tile.GetTileData(cellPos, groundLayer.layoutGrid, ref tileData); // 输出Tile的世界位置 Debug.Log("Tile世界位置:" + tileData.position); } else { Debug.Log("未检测到Tile"); }
关键注意事项
- Z值修正:
ScreenToWorldPoint默认使用Input.mousePosition的Z值(为0),若Tilemap不在相机的近裁剪面,会导致转换出的世界坐标不在Tilemap平面上,进而WorldToCell得到错误的单元格坐标。必须将Z值设置为Tilemap所在平面的Z值。 - 坐标转换必要性:必须通过
WorldToCell将世界坐标转换为Tilemap的单元格坐标,这是GetTile的唯一有效参数类型。 - GetTileData的正确调用:需要传入单元格坐标、Tilemap关联的Grid组件(即
groundLayer.layoutGrid),并传入一个TileData引用用于接收数据,这样才能正确获取Tile的位置等属性。
额外排查点
- 确认
groundLayer变量确实引用了目标Tilemap对象,没有误拖其他层级。 - 检查Grid组件和Tilemap的单元格大小设置一致,避免坐标转换偏差。
- 若使用透视相机,Z值需要设置为相机到Tilemap平面的距离,可通过
mouseWorldPos.z = groundLayer.transform.position.z - Camera.main.transform.position.z;计算。
内容的提问来源于stack exchange,提问作者Mengart
相关产品推荐
相关产品推荐

