如何从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
相关产品推荐
相关产品推荐

