Unity网格生成问题:如何使三角形顶点与下一个GameObject的点对齐?
问题分析与解决
你的问题出在坐标转换的对象搞反了,而且没有正确获取上一段黄点的实际位置:
- 你现在用
lastSegment.yellowDotRight.transform.InverseTransformPoint(segment.transform.position),是把当前段根节点的世界坐标,转成了上一段右黄点的局部坐标——但你实际需要的是上一段右黄点的世界坐标,转成当前段GameObject的局部坐标,因为Mesh的顶点是基于当前段的局部空间的。 - 代码里的
meshf是未定义变量,应该直接用当前段获取到的MeshFilter组件。 - 第一次循环时
lastSegment如果没初始化会触发空引用,记得循环前给它赋值(比如赋值为第一个segment,再从第二个开始循环)。
修正后的代码
// 先初始化lastSegment,确保segments不为空 if(segments.Count == 0) return; Segment lastSegment = segments[0]; // 从第二个段开始处理,第一个段可单独处理或跳过 for(int i = 1; i < segments.Count; i++) { Segment segment = segments[i]; MeshFilter meshFilter = segment.GetComponent<MeshFilter>(); Mesh mesh = meshFilter.mesh; mesh.Clear(); List<Vector3> vertList = new List<Vector3>(); // 核心修正:把上一段右黄点的世界坐标,转成当前段的局部坐标 Vector3 lastRightDotWorldPos = lastSegment.yellowDotRight.transform.position; Vector3 relativeToCurrentSegment = segment.transform.InverseTransformPoint(lastRightDotWorldPos); vertList.Add(relativeToCurrentSegment); // 转换后就能和上一段黄点对齐 // 当前段的右、左黄点局部坐标(原逻辑正确,基于当前段中心偏移) vertList.Add(new Vector3(0f, 0f, -segment.yellowDotRightDistanceFromCenter * thicknessFactor)); vertList.Add(new Vector3(0f, 0f, segment.yellowDotLeftDistanceFromCenter * thicknessFactor)); // 赋值网格数据并刷新 mesh.vertices = vertList.ToArray(); mesh.triangles = new int[] { 0, 1, 2 }; mesh.RecalculateNormals(); // 刷新法线确保光照正常 meshFilter.mesh = mesh; lastSegment = segment; }
额外说明
- Mesh的顶点必须是当前段GameObject的局部坐标,所以所有外部点都要通过当前段的
transform.InverseTransformPoint()转成局部空间。 - 如果黄点本身是基于段的局部空间偏移的,也可以直接用黄点的局部坐标转换,但核心逻辑不变。
内容的提问来源于stack exchange,提问作者doc4
相关产品推荐
相关产品推荐

