Unity用Mesh画多边形、圆形

本文详细介绍了如何在Unity中使用Mesh组件绘制正多边形,包括正五边形和正八边形。通过调整顶点和三角面的排列,实现了不同多边形的绘制,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先贴上效果图
在这里插入图片描述
在这里插入图片描述
上面两个图就是使用Unity的Mesh画出的正五边形和正八变形。

无论是研究过Mesh还是只是有所听说,应该都听过网格,上面两个图形就是利用来网格的特性来实现的。

首先讲一下Mesh原理
无论渲染什么图形,就需要用到mesh将图形的形状展示出来,Unity中所有图形都是三角面组成,例如一个正方形
在这里插入图片描述
一个正方形是由定点组成的两个三角片组成(三角形a和b),012组成三角形a,023组成三角形b,由此组成了一个正方形。注意,三角形的三个顶点排列必须是顺时针,如果是逆时针,在反面才会看到。

多边形也是类似原理,如图在这里插入图片描述
代码

	public Button DrawPolygonButton;
	public InputField countInput;
	[HideInInspector]
	public GameObject drawGo;

	[HideInInspector]
	public MeshFilter meshFilter;

	[HideInInspector]
	public MeshRenderer meshRenderer;

	int count;

	void Awake(){
		DrawPolygonButton.transform.GetChild (0).GetComponent<Text> ().text = "DrawPolygon";
		DrawPolygonButton.onClick.AddListener (DrawPolygon);
	
		countInput.onValueChanged.AddListener ((string a) => {
			if (!string.IsNullOrEmpty(a)){
				count = System.Convert.ToInt32(a);
			}
		});
	}

	Mesh PrepareMesh(){
		drawGo = new GameObject ("DrawWithMesh");
		drawGo.transform.SetParent (transform);
		drawGo.transform.localPosition = Vector3.zero;
		drawGo.transform.localScale = Vector3.one;

		meshRenderer = drawGo.AddComponent<MeshRenderer> ();
		meshRenderer.material = mat;

		meshFilter = drawGo.AddComponent<MeshFilter> ();
		Mesh mesh = meshFilter.mesh;
		mesh.Clear();

		return mesh;
	}

	void DrawPolygon(){
		int circle_count = count;
		Mesh mesh = PrepareMesh ();
		Vector3[] vertices = new Vector3[circle_count + 1];
		vertices[0] = Vector3.zero;
		float pre_rad = Mathf.Deg2Rad * 360 / circle_count;
		for (int i = 0; i < circle_count; i++) {
			float deg = -i * pre_rad;
			float x = Mathf.Cos (deg);
			float y = Mathf.Sin (deg);
			vertices [i + 1] = new Vector3 (x, y, 0) * 3;
		}
		mesh.vertices = vertices;	

		int[] triangles = new int[circle_count * 3];
		for (int i = 0; i < triangles.Length; i+=3) {
			int first = 0;
			int second = i / 3 + 1;
			int third = second + 1;
			if (third > circle_count) {
				third = 1;
			}
			triangles [i] = first;
			triangles [i + 1] = second;
			triangles [i + 2] = third;
		}
		mesh.triangles = triangles;
	}

如果要画圆形,则适量增加count数量就行

其他

更多Blog请见:https://yiyuan1130.github.io/
Github地址:https://github.com/yiyuan1130

### 在 Unity 中通过 Mesh 实现镂空效果 为了实现在 Unity 中对 `Mesh` 进行挖洞并创建镂空效果,可以采用多种方法。一种常见的方式是在 UGUI 的自定义图形组件中重写 `OnPopulateMesh` 函数来控制网格的生成过程[^3]。 具体来说,可以通过以下方式实现: #### 使用 OnPopulateMesh 方法构建镂空形状 当需要在一个矩形区域内制造圆形或其他形状的镂空时,可以在继承自 `Graphic` 类的对象里覆盖 `OnPopulateMesh` 函数。此函数允许开发者手动指定哪些顶点应该被包含到最终渲染出来的多边形当中去。对于想要达到的镂空目的而言,关键是计算出两个层次上的四角坐标位置:一个是代表整个控件范围的大框;另一个则是表示要移除部分的小框。接着在这两者间建立连接形成一系列三角面片,从而完成视觉上看起来像是“掏空”的处理。 ```csharp using UnityEngine; using UnityEngine.UI; public class HollowMask : MaskableGraphic { protected override void OnPopulateMesh(VertexHelper vh) { vh.Clear(); // 外部边界(原始 RectTransform) var rectTransform = this.rectTransform; Vector2[] outerCorners = new Vector2[4]; rectTransform.GetWorldCorners(outerCorners); // 内部边界(假设为正方形中心偏移量) float insetSize = 50f; // 可调整大小 Rect innerRect = new Rect( (rectTransform.rect.width / 2 - insetSize), (rectTransform.rect.height / 2 - insetSize), insetSize * 2, insetSize * 2); Vector2[] innerCorners = new Vector2[4]; innerRect.GetCorners(innerCorners); // 创建8个三角形用于填充空间之间的间隙 AddQuad(vh, outerCorners[0], outerCorners[1], innerCorners[0], innerCorners[1]); AddQuad(vh, outerCorners[1], outerCorners[2], innerCorners[1], innerCorners[2]); AddQuad(vh, outerCorners[2], outerCorners[3], innerCorners[2], innerCorners[3]); AddQuad(vh, outerCorners[3], outerCorners[0], innerCorners[3], innerCorners[0]); // 辅助函数用于简化代码结构 static void AddQuad(VertexHelper helper, Vector2 p1, Vector2 p2, Vector2 q1, Vector2 q2){ helper.AddVert(p1); helper.AddVert(q1); helper.AddVert(p2); helper.AddTriangle(helper.currentVertCount-3,helper.currentVertCount-2,helper.currentVertCount-1); helper.AddVert(q2); helper.AddVert(p2); helper.AddVert(q1); helper.AddTriangle(helper.currentVertCount-3,helper.currentVertCount-2,helper.currentVertCount-1); } } } ``` 上述脚本展示了如何基于给定的外部内部矩形区域构造一个简单的镂空图案。实际应用中可能还需要考虑更多细节比如材质属性设置、抗锯齿等问题以获得更好的显示质量。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值