Unity中用LineRenderer绘制带Edge Collider 2D的线条时碰撞体位置错误
解决Edge Collider 2D与LineRenderer绘制位置偏差的问题
你碰到的这个问题我之前做手绘类游戏时也踩过坑——明明LineRenderer的黑色线条跟着鼠标走得好好的,Edge Collider 2D的绿色碰撞线却偏到姥姥家,试了好几种屏幕转世界坐标的方法都没效果对吧?
问题根源
核心问题出在屏幕坐标转世界坐标时的Z轴处理:Input.mousePosition的Z值默认是0,而Camera.main.ScreenToWorldPoint会根据这个Z值计算对应的世界位置。如果你的相机(尤其是正交相机)不在Z=0平面,直接转换得到的坐标Z值会和你的线条预制体不一致,导致Edge Collider 2D因为父物体的空间关系出现偏移。
另外,你的代码里直接把Vector3转成Vector2存进fingerPositions,虽然Unity会自动截断Z值,但如果原始的世界坐标Z值不对,截断后还是会影响碰撞体的位置计算。
修复方案
我给你调整了代码,主要做了这几个关键修改:
- 强制把转换后的世界坐标Z值设为0,和你的线条预制体保持同一平面
- 确保Edge Collider 2D的points数组使用的是和LineRenderer完全一致的坐标
- 优化了坐标距离判断的逻辑,避免冗余点
修改后的完整代码:
public class DrawLine : MonoBehaviour { public GameObject linePrefab; public GameObject currentLine; public LineRenderer lineRenderer; public EdgeCollider2D edgeCollider; public List<Vector2> fingerPositions; void Update() { if (Input.GetMouseButtonDown(0)) { CreateLine(); } if (Input.GetMouseButton(0) && currentLine != null) { Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); // 强制设置Z轴为0,和线条预制体保持同一平面 mouseWorldPos.z = 0; Vector2 tempFingerPos = mouseWorldPos; // 只添加距离足够远的点,避免性能浪费 if (Vector2.Distance(tempFingerPos, fingerPositions[fingerPositions.Count - 1]) > 0.1f) { UpdateLine(tempFingerPos); } } } void CreateLine() { currentLine = Instantiate(linePrefab, Vector3.zero, Quaternion.identity); lineRenderer = currentLine.GetComponent<LineRenderer>(); edgeCollider = currentLine.GetComponent<EdgeCollider2D>(); // 确保预制体的Transform是默认状态(缩放1,1,1,无偏移) currentLine.transform.localScale = Vector3.one; currentLine.transform.position = Vector3.zero; fingerPositions.Clear(); Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); mouseWorldPos.z = 0; Vector2 initialPos = mouseWorldPos; // 初始化两个相同的点,避免LineRenderer报错 fingerPositions.Add(initialPos); fingerPositions.Add(initialPos); lineRenderer.SetPosition(0, initialPos); lineRenderer.SetPosition(1, initialPos); edgeCollider.points = fingerPositions.ToArray(); } void UpdateLine(Vector2 newFingerPos) { fingerPositions.Add(newFingerPos); lineRenderer.positionCount = fingerPositions.Count; lineRenderer.SetPosition(lineRenderer.positionCount - 1, newFingerPos); edgeCollider.points = fingerPositions.ToArray(); } }
额外验证步骤
- 检查你的线条预制体:确保它的Transform组件
Scale是(1,1,1),Position是(0,0,0),Edge Collider 2D的Offset是(0,0) - 运行游戏后,在Scene视图里查看LineRenderer的每个点和Edge Collider的点,确认它们的坐标完全重合
这样修改后,Edge Collider 2D应该就能和LineRenderer完美对齐了!
内容的提问来源于stack exchange,提问作者becaque
相关产品推荐
相关产品推荐

