You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过鼠标位置获取指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:02:18