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

Unity3D中基于LineRenderer绘制点生成连续类线条网格问题咨询

问题根因

你当前的网格生成逻辑存在两个核心问题导致间隙:

  1. 每个LineRenderer采样点单独生成独立的四边形面片,相邻点的面片没有做衔接,两点间距超过面片大小就会出现断层
  2. 顶点偏移计算是和第一个点的坐标做差,完全没有考虑线段的实际朝向,无法匹配线条的走向

解决方案

第一步:修改网格生成逻辑,生成连续带状网格

直接替换你的MeshGenerator代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(MeshFilter))]
public class MeshGenerator : MonoBehaviour
{
    public Vector3[] linePoints;
    private Vector3[] _vertices;
    private int[] _triangles;
    private Mesh _mesh;
    private Draw draw;
    // 线条宽度,和你原来的0.2f总宽度对应
    public float lineWidth = 0.2f;

    void Start()
    {
        draw = GameObject.FindGameObjectWithTag("GameController").GetComponent<Draw>();
        _mesh = GetComponent<MeshFilter>().mesh;
    }

    void Update()
    {
        if(Input.GetKeyUp(KeyCode.Mouse0))
        {
            if(draw.currentLineRender == null || draw.currentLineRender.positionCount < 2) return;
            CreateContinuousLineMesh();
            UpdateMesh();
        }        
    }

    private void CreateContinuousLineMesh()
    {
        int pointCount = draw.currentLineRender.positionCount;
        linePoints = new Vector3[pointCount];
        draw.currentLineRender.GetPositions(linePoints);

        // 每个点生成左右两个顶点,2个顶点/点,2个三角形/段 = 6个索引/段
        _vertices = new Vector3[pointCount * 2];
        _triangles = new int[(pointCount - 1) * 6];

        int vIndex = 0;
        int tIndex = 0;

        for (int i = 0; i < pointCount; i++)
        {
            Vector3 forwardDir = Vector3.zero;
            // 计算线段方向
            if (i == 0)
                forwardDir = (linePoints[i + 1] - linePoints[i]).normalized;
            else if (i == pointCount - 1)
                forwardDir = (linePoints[i] - linePoints[i - 1]).normalized;
            else
                forwardDir = ((linePoints[i + 1] - linePoints[i]).normalized + (linePoints[i] - linePoints[i - 1]).normalized).normalized;

            // 计算垂直于线段的侧向偏移方向(如果是XY平面2D画线,把Vector3.up改成Vector3.forward即可)
            Vector3 sideDir = Vector3.Cross(forwardDir, Vector3.up).normalized;
            float halfWidth = lineWidth * 0.5f;

            // 生成当前点的左右两个顶点
            _vertices[vIndex] = linePoints[i] + sideDir * halfWidth;
            _vertices[vIndex + 1] = linePoints[i] - sideDir * halfWidth;

            // 生成三角形,跳过第一个点
            if (i > 0)
            {
                // 两个三角形组成一个四边形段
                _triangles[tIndex] = vIndex - 2;
                _triangles[tIndex + 1] = vIndex;
                _triangles[tIndex + 2] = vIndex - 1;

                _triangles[tIndex + 3] = vIndex - 1;
                _triangles[tIndex + 4] = vIndex;
                _triangles[tIndex + 5] = vIndex + 1;

                tIndex += 6;
            }

            vIndex += 2;
        }
    }

    private void UpdateMesh()
    {
        if(GetComponent<MeshCollider>() != null)
            Destroy(GetComponent<MeshCollider>());
            
        _mesh.Clear();
        _mesh.vertices = _vertices;
        _mesh.triangles = _triangles;
        _mesh.RecalculateNormals();
        
        MeshCollider meshCollider = gameObject.AddComponent<MeshCollider>();
        meshCollider.convex = true;
    }   
}

第二步(可选):优化快速绘制时点采样密度

如果快速绘制时LineRenderer本身采样点太稀疏,你可以把Draw类里的_minDistance值改小,比如从0.01f改成0.005f,提升点的采样密度,进一步避免大间距。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:36:02