You need to enable JavaScript to run this app. Unity中检测Tilemap特定瓦片点击时无法识别单个瓦片问题
优惠活动
大模型
产品
解决方案
定价
更多

Unity中检测Tilemap特定瓦片点击时无法识别单个瓦片问题

问题根因
  • Physics2D.Raycast默认检测到的是Tilemap挂载的Tilemap Collider 2D的整体合并碰撞域,该组件不会为单个瓦片生成独立碰撞体,因此只能识别到Tilemap本身,无法区分单个瓦片。
  • 射线逻辑存在冗余:俯视角下已完成屏幕坐标到世界点的转换,无需向Vector2.down方向发射射线,错误的射线方向可能进一步提升检测误差。
修复方案

有两种可选实现方式,优先推荐无需物理组件的坐标转换方案:

方案1:Tilemap API直接检测(推荐)

无需依赖碰撞组件,直接通过坐标转换判定点击位置是否存在目标瓦片,性能更稳定:

  1. 将目标Tilemap组件挂载到代码的targetTilemap公共字段中
  2. 替换为如下代码:
public class DetectClickOnTile : MonoBehaviour
{
    // Inspector面板中指定需要检测的Tilemap
    public Tilemap targetTilemap;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Vector3 worldPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            // 世界坐标转换为Tilemap网格坐标
            Vector3Int tilePosition = targetTilemap.WorldToCell(worldPoint);
            
            // 判定该网格位置是否存在瓦片(仅你填充的黑色瓦片会返回true)
            if (targetTilemap.HasTile(tilePosition))
            {
                Debug.Log("点击到有效瓦片,网格坐标:" + tilePosition);
                // 此处补充瓦片对应的触发逻辑
            }
        }
    }
}

方案2:物理碰撞检测适配

如果必须使用Raycast方案,调整碰撞组件配置即可:

  • 给Tilemap添加Tilemap Collider 2D,勾选Used By Composite参数
  • 额外添加Composite Collider 2D组件,自动为每个瓦片生成独立碰撞边界
  • 保留原射线代码即可检测到单个瓦片的碰撞信息

内容的提问来源于stack exchange,提问作者Aironas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 16:00:02