Unity3D中基于LineRenderer绘制点生成连续类线条网格问题咨询
问题根因
你当前的网格生成逻辑存在两个核心问题导致间隙:
- 每个LineRenderer采样点单独生成独立的四边形面片,相邻点的面片没有做衔接,两点间距超过面片大小就会出现断层
- 顶点偏移计算是和第一个点的坐标做差,完全没有考虑线段的实际朝向,无法匹配线条的走向
解决方案
第一步:修改网格生成逻辑,生成连续带状网格
直接替换你的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
相关产品推荐
相关产品推荐

