自学内容网 自学内容网

Unity中Mesh使用MeshTopology.Lines模式绘制线条及MeshTopology.Quads模式绘制网格参考

        Unity中MeshFilter中的Mesh默认情况下使用MeshTopology.Trigangles类型绘制网格,就是通常的绘制三角形网格,实际上Mesh有五种绘制模式,对应MeshTopology的枚举,分别是

Triangles网格由三角形构成。
Quads网格由四边形构成。
Lines网格由线条构成。
LineStrip网格是线条带。
Points网格由点构成。

        这里以Lines和Quads为例说明Trigangles方式之外的绘制方式。

        参考代码如下:

using System.Collections.Generic;
using UnityEngine;

public class LineMeshTest : MonoBehaviour
{
[SerializeField]
Material material;

void Start()
{
GameObject circle = new GameObject("Circle");
circle.transform.SetParent(transform);
circle.transform.localPosition = new Vector3(-5, 0, 0);
MeshFilter filterCircle = circle.AddComponent<MeshFilter>();
Mesh meshCircle = GetCircleMesh(2);
filterCircle.mesh = meshCircle;
MeshRenderer renderCircle = circle.AddComponent<MeshRenderer>();
renderCircle.material = material;

GameObject quad = new GameObject("Quad");
quad.transform.SetParent(transform);
quad.transform.localPosition = new Vector3(5, 0, 0);
MeshFilter filterQuad = quad.AddComponent<MeshFilter>();
Mesh meshQuad = GetQuadMesh(5);
filterQuad.mesh = meshQuad;
MeshRenderer rendeQuad = quad.AddComponent<MeshRenderer>();
rendeQuad.material = material;
}

Mesh GetCircleMesh(float radius)
{
List<Vector3> vertexList = new();
List<int> indexList = new List<int>();
float radDelta = Mathf.PI / 36;
for (float i = 0; i < 72f; i++)
{
float rad = radDelta * i;
Vector3 vert = new(radius * Mathf.Cos(rad), radius * Mathf.Sin(rad), 0);
vertexList.Add(vert);
}

indexList.Add(0);
for (int i = 1; i < 72; i++)
{
indexList.Add(i);
indexList.Add(i);
}
indexList.Add(0);

Mesh mesh = new();
mesh.SetVertices(vertexList);
mesh.SetIndices(indexList.ToArray(), MeshTopology.Lines, 0);
return mesh;
}

Mesh GetQuadMesh(float size)
{
float s = size * 0.5f;
Vector3[] vertices = new[] { new Vector3(s, s, 0), new Vector3(s, -s, 0), new Vector3(-s, -s, 0), new Vector3(-s, s, 0) };
int[] indices = new[] { 0, 1, 2, 3 };

Mesh mesh = new Mesh();
mesh.SetVertices(vertices);
mesh.SetIndices(indices, MeshTopology.Quads, 0);

return mesh;
}
}

         这个例子里面使用Mesh绘制了一个圆形线条,注意这两行语句:

mesh.SetIndices(indexList.ToArray(), MeshTopology.Lines, 0);
mesh.SetIndices(indices, MeshTopology.Quads, 0);


原文地址:https://blog.csdn.net/ttod/article/details/142595682

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!