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

如何从TilemapCollider2D获取各碰撞区域列表及形状坐标?

嘿,这个问题我之前在项目里刚好碰到过!确实TilemapCollider2D只给了shapeCount属性,但要拿到每个碰撞区域的坐标,得借助Unity的Physics2D.GetShape相关方法来实现,我给你捋捋具体怎么做:

获取TilemapCollider2D的所有碰撞区域坐标

首先要确保你的TilemapCollider2D已经生成了有效碰撞形状——如果是动态修改过Tile的情况,记得先调用tilemapCollider2D.ClearTiles()再tilemapCollider2D.BuildCollider()刷新碰撞数据。

接下来就可以通过循环遍历每个形状,提取顶点坐标了:

using UnityEngine;

public class TilemapColliderShapeGetter : MonoBehaviour
{
    [SerializeField] private TilemapCollider2D _tilemapCollider;

    void Start()
    {
        if (_tilemapCollider == null)
        {
            Debug.LogWarning("请指定TilemapCollider2D组件!");
            return;
        }

        // 遍历所有碰撞形状
        for (int shapeIndex = 0; shapeIndex < _tilemapCollider.shapeCount; shapeIndex++)
        {
            // 获取当前形状的顶点数量,创建对应大小的数组
            int pointCount = _tilemapCollider.GetShapePointCount(shapeIndex);
            Vector2[] localVertices = new Vector2[pointCount];
            
            // 填充顶点数据到数组
            _tilemapCollider.GetShape(shapeIndex, localVertices);

            // 处理顶点数据(示例:打印本地坐标和世界坐标)
            Debug.Log($"=== 第{shapeIndex}个碰撞形状 ===");
            foreach (Vector2 localPos in localVertices)
            {
                // 转换为世界坐标(如果需要的话)
                Vector3 worldPos = _tilemapCollider.transform.TransformPoint(localPos);
                Debug.Log($"本地坐标:{localPos} | 世界坐标:{worldPos}");
            }
        }
    }
}

几个关键细节要注意:

  • GetShapePointCount(int shapeIndex):用来获取指定索引的碰撞形状包含多少个顶点,帮你确定需要创建的数组大小。
  • GetShape(int shapeIndex, Vector2[] vertices):把指定形状的顶点数据填充到你传入的数组中,这个方法是直接修改数组内容的。
  • 默认获取的是Tilemap的本地坐标,如果需要世界空间的坐标,记得用TransformPoint做转换。
  • 不管你的TilemapCollider2D是用的“Single”还是“Composite”模式,这个方法都能正常提取所有碰撞形状的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:32:00