获取PolygonCollider2D点世界空间位置时出现偏差的问题
问题原因与解决方案
你当前的错误在于局部坐标转世界空间的方式完全不对:PolygonCollider2D的points是相对于碰撞体所属Transform的局部坐标,需要考虑物体的位移、旋转、缩放,而你用bounds.center或者直接加transform.position的方式,都没正确处理这些变换。
正确的转换方式
直接使用Transform的TransformPoint方法,它会自动处理所有变换参数(位移、旋转、缩放),得到准确的世界空间坐标:
Vector2 p1 = polygon.transform.TransformPoint(polygon.points[i]);
修正后的完整调试脚本
List<Vector2> debugPositions = new(); public void OnSceneGUI() { for (int i = 0; i < debugPositions.Count; i++) Handles.DrawSolidRectangleWithOutline(new Rect(debugPositions[i].x, debugPositions[i].y, 0.2f, 0.2f), Color.cyan, Color.black); } void GetPolygonPointsWorldPos(PolygonCollider2D polygon) { debugPositions.Clear(); for (int i = 0; i < polygon.points.Length; i++) { // 正确转换局部点到世界空间 Vector2 p1 = polygon.transform.TransformPoint(polygon.points[i]); Vector2 p2 = polygon.transform.TransformPoint(polygon.points[(i + 1) % polygon.points.Length]); debugPositions.Add(p1); debugPositions.Add(p2); } }
为什么之前的方法会出错
bounds.center不是转换基准:bounds.center是多边形所有点包围盒的世界空间中心,和Transform的原点(物体的position)完全是两个概念。当多边形不对称、物体有缩放时,这个中心会和Transform原点偏移,直接加局部点自然会错位,而且碰撞体越大(缩放越大),偏移越明显。- 直接加
transform.position忽略了旋转和缩放:polygon.points是局部坐标,当物体有旋转或非等比缩放时,局部坐标不能直接和世界空间的position相加,必须通过TransformPoint完成坐标空间的转换。
内容的提问来源于stack exchange,提问作者sandsalamand
相关产品推荐
相关产品推荐

