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

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();
    }
}

额外验证步骤

  1. 检查你的线条预制体:确保它的Transform组件Scale是(1,1,1),Position是(0,0,0),Edge Collider 2D的Offset是(0,0)
  2. 运行游戏后,在Scene视图里查看LineRenderer的每个点和Edge Collider的点,确认它们的坐标完全重合

这样修改后,Edge Collider 2D应该就能和LineRenderer完美对齐了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:49:07