C# Mesh类开发遇「并非所有代码路径都返回值」报错如何解决
问题原因&修复方案
1. 「并非所有代码路径都返回值」报错直接原因
你的方法声明为返回Mesh类型,但方法执行完所有逻辑后没有添加return语句返回对应结果,触发C#语法校验错误。
2. 代码中隐藏的其他BUG
- UV赋值逻辑错误:4行UV赋值语句全部写死为
vIndex0索引,vIndex1/vIndex2/vIndex3对应的UV没有被赋值,运行后新添加的面片纹理会显示异常 - 扩容后的数组未回写Mesh:你新建了扩容后的vertices、uvs、triangles数组并填充了数据,但没有赋值回mesh实例的对应属性,修改不会生效
- 三角形数组未补全新面片的索引:你给triangles数组扩容了6位(对应1个四边形的2个三角形),但没有给新增的6个索引位置赋值,新的面片不会被渲染
修改后的完整代码
public static Mesh AddToMesh(Mesh mesh, Vector3 pos, float rot, Vector3 baseSize, Vector2 uv00, Vector2 uv11) { if (mesh == null) { mesh = CreateEmptyMesh(); } Vector3[] vertices = new Vector3[4 + mesh.vertices.Length]; Vector2[] uvs = new Vector2[4 + mesh.uv.Length]; int[] triangles = new int[6 + mesh.triangles.Length]; mesh.vertices.CopyTo(vertices, 0); mesh.uv.CopyTo(uvs, 0); mesh.triangles.CopyTo(triangles, 0); int index = vertices.Length / 4 - 1; //relocate vertices int vIndex = index * 4; int vIndex0 = vIndex; int vIndex1 = vIndex + 1; int vIndex2 = vIndex + 2; int vIndex3 = vIndex + 3; baseSize *= .5f; bool skewed = baseSize.x != baseSize.y; if (skewed) { vertices[vIndex0] = pos + GetQuaternionEuler(rot) * new Vector3(-baseSize.x, baseSize.y); vertices[vIndex1] = pos + GetQuaternionEuler(rot) * new Vector3(-baseSize.x, -baseSize.y); vertices[vIndex2] = pos + GetQuaternionEuler(rot) * new Vector3(baseSize.x, -baseSize.y); vertices[vIndex3] = pos + GetQuaternionEuler(rot) * baseSize; } else { vertices[vIndex0] = pos + GetQuaternionEuler(rot - 270) * baseSize; vertices[vIndex1] = pos + GetQuaternionEuler(rot - 180) * baseSize; vertices[vIndex2] = pos + GetQuaternionEuler(rot - 90) * baseSize; vertices[vIndex3] = pos + GetQuaternionEuler(rot - 0) * baseSize; } //relocate uvs 修正索引错误 uvs[vIndex0] = new Vector2(uv00.x, uv11.y); uvs[vIndex1] = new Vector2(uv00.x, uv00.y); uvs[vIndex2] = new Vector2(uv11.x, uv00.y); uvs[vIndex3] = new Vector2(uv11.x, uv11.y); // 补全新增三角形索引 int tIndex = index * 6; triangles[tIndex + 0] = vIndex0; triangles[tIndex + 1] = vIndex3; triangles[tIndex + 2] = vIndex1; triangles[tIndex + 3] = vIndex1; triangles[tIndex + 4] = vIndex3; triangles[tIndex + 5] = vIndex2; // 数组回写mesh mesh.vertices = vertices; mesh.uv = uvs; mesh.triangles = triangles; // 补充返回语句 解决返回值报错 return mesh; }
内容的提问来源于stack exchange,提问作者Dewald Erasmus
相关产品推荐
相关产品推荐

