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

Unity中Raycast2D无法识别TilemapColliders问题求助

解决Tilemap Collider 2D射线检测无效的问题

关键修复与配置步骤

1. 修正屏幕坐标转世界坐标的z值问题

正交相机下,ScreenToWorldPoint的z值必须对应相机到Tilemap平面的垂直距离,否则射线会落在错误平面上,无法命中Tilemap碰撞体。调整后的代码如下:

private void MoveToTile()
{
    Vector2 mouseScreenPos = _playerInput.Player.MousePosition.ReadValue<Vector2>();
    // z值取相机与Tilemap的垂直距离,例如相机z=-10、Tilemap z=0时填10
    Vector3 mouseWorldPos = _camera.ScreenToWorldPoint(new Vector3(mouseScreenPos.x, mouseScreenPos.y, Mathf.Abs(_camera.transform.position.z)));
    
    // 2D场景用点检测更直接,同时指定Tilemap所在层级避免误检测
    RaycastHit2D hit = Physics2D.Raycast(mouseWorldPos, Vector2.zero, 0f, LayerMask.GetMask("你的Tilemap层名"));
    if (hit.collider != null)
    {
        // 碰撞体可能挂在Tilemap子物体上,用GetComponentInParent获取Tilemap组件
        Tilemap clickedTilemap = hit.collider.GetComponentInParent<Tilemap>();
        if(clickedTilemap != null)
        {
            // 这里编写获取到Tilemap后的逻辑
        }
    }
}

2. 正确配置Tilemap碰撞组件组合

仅添加Tilemap Collider 2D无法让射线正常检测,必须配合以下配置:

  • 给Tilemap对象添加Tilemap Collider 2D,勾选组件面板的Used By Composite选项。
  • 添加Composite Collider 2D,不要勾选Is Trigger(若需触发检测,需改用Physics2D.RaycastAll并单独处理)。
  • 给Tilemap对象添加Rigidbody 2D,设置Body Type为Static,保持Is Simulated勾选。

3. 检查射线检测的层过滤

确保射线检测时指定了Tilemap所在的层级,避免因层掩码过滤导致检测不到碰撞体。

常见误区提醒

  • 不要用Vector3.forward作为2D射线方向:2D物理系统仅识别Vector2方向,点击场景用点检测(方向设为Vector2.zero)更合适。
  • 注意碰撞体与Tilemap的层级关系:若碰撞体是Tilemap的子物体,需用GetComponentInParent<Tilemap>()代替GetComponent<Tilemap>()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:12:38