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

如何让LineRenderer仅记录网格位置?FlowFree类游戏拖拽画线问题

问题分析与解决方案

你的代码核心问题在于每帧Update都会重复触发网格点添加逻辑,且没有做重复点的过滤,导致LineRenderer位置无限增加,同时实时鼠标位置覆盖了刚添加的网格点,完全没达到吸附记录的效果。

关键问题点

  1. 只要鼠标停在某个网格点的距离范围内,每帧都会执行dragCount +=1,无限增加位置数量
  2. 最后一行的line.SetPosition(dragCount -1, mousePosition)会直接覆盖刚添加的网格点位置
  3. 没有记录已选中的网格点,同一个点会被重复添加

修改后的代码实现

首先在类中添加几个辅助变量:

private List<Vector3> selectedGridPoints = new List<Vector3>(); // 存储已选中的网格点
private Vector3 currentSnapPoint; // 当前鼠标吸附的网格点

然后替换Update中的逻辑:

if (Input.GetMouseButtonDown(0))
{
    RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero, Mathf.Infinity);
    if (hit.collider != null && hit.collider.tag == "Dot")
    {
        isDragging = true;
        // 初始化新线条
        selectedGridPoints.Clear();
        selectedGridPoints.Add(hit.collider.transform.position);
        currentSnapPoint = hit.collider.transform.position;
        line.positionCount = selectedGridPoints.Count;
        line.SetPosition(0, selectedGridPoints[0]);
    }
}

if (Input.GetMouseButton(0) && isDragging)
{
    Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    mousePos.z = 0f;

    // 查找离鼠标最近的网格点
    Vector3 closestGridPoint = currentSnapPoint;
    float minDistance = float.MaxValue;
    foreach (Vector3 target in pos)
    {
        float dist = Vector3.Distance(mousePos, target);
        if (dist < minDistance)
        {
            minDistance = dist;
            closestGridPoint = target;
        }
    }

    // 仅当切换到新的未选中网格点时,才添加到线条中
    if (closestGridPoint != currentSnapPoint && !selectedGridPoints.Contains(closestGridPoint))
    {
        selectedGridPoints.Add(closestGridPoint);
        currentSnapPoint = closestGridPoint;
        // 更新LineRenderer的固定网格点位置
        line.positionCount = selectedGridPoints.Count;
        for (int i = 0; i < selectedGridPoints.Count; i++)
        {
            line.SetPosition(i, selectedGridPoints[i]);
        }
    }

    // 实时显示鼠标到最后一个网格点的拖拽线条(可选:若要完全吸附,可替换为currentSnapPoint)
    line.positionCount = selectedGridPoints.Count + 1;
    line.SetPosition(selectedGridPoints.Count, mousePos);
}

if (Input.GetMouseButtonUp(0) && isDragging)
{
    isDragging = false;
    // 结束拖拽后,移除临时拖拽点,只保留选中的网格点
    line.positionCount = selectedGridPoints.Count;
    // 只有起点的话清空线条
    if (line.positionCount <= 1)
    {
        line.positionCount = 0;
        selectedGridPoints.Clear();
    }
}

核心优化点

  • 用selectedGridPoints列表记录所有已选中的网格点,彻底避免重复添加
  • 仅当鼠标切换到新的未选中网格点时,才增加LineRenderer的位置数量
  • 拖拽过程中保留临时的鼠标位置线条,结束拖拽后自动截断为仅网格点连接的线条
  • 移除了原代码中每帧触发的无限自增逻辑,改为按需添加位置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:02:48