首先介绍一下关于自定义Mesh多边形所必须的组件:
1.Mesh Filter组件:用于Mesh网格搭建形成形状样子
2.Mesh Renderer组件:用于将搭建出来的形状渲染出来,通俗来讲就是给他皮肤,给他颜色等等
我们都知道各个图形都是由很多个小的三角形组拼出来的,那么形成我们的Mesh所需要的条件就跟三角形有关
1.顶点坐标:一个Vector3[] 数组
2.指定三角形的顶点排序: 一个Int[] 数组
3.UV、法线、切线的重新制定:Unity内置方法已经写好
这里通过一个例子说明一下Mesh绘制多边形问题:
首先,在场景中我们新建一个Plane面,并设置其标签Tag为“Ground”,用于我们手动取点检测
然后,新建取点脚本“GetEnterPoints”,用于收集我们在Plane面上的点(挂挂载在场景中)
接下来,新建生成多边形脚本“CreateMesh”,用于生成我们自定义的多边形
最后,运行点击进行测试
当然,脚本的类名根据需要自定义更改,下面附上代码与效果图
“GetEnterPoints”脚本:
1 using UnityEngine; 2 using System.Collections; 3 using System.Collections.Generic; 4 5 6 //获取组成多变形点类 7 public class GetEnterPoints : MonoBehaviour 8 { 9 //存储手动获取到的多边形点列表 10 private List<Vector3> m_enterPoints = new List<Vector3>(); 11 12 // Update is called once per frame 13 void Update () { 14 15 //左键取点 16 if (Input.GetMouseButtonDown(0)) 17 { 18 //屏幕位置转射线 19 Ray tRay = Camera.main.ScreenPointToRay(Input.mousePosition); 20 //射线返回点信息 21 RaycastHit tHit; 22 //发射射线 23 if(Physics .Raycast( tRay ,out tHit )) 24 { 25 //如果打在地面上,则将点存储起来 26 if (tHit.transform.tag == "Ground") 27 { 28 //这里为了形成的面不与原先底板重合,提升了一个高度 29 m_enterPoints.Add(tHit.point + new Vector3(0, 1, 0)); 30 } 31 } 32 } 33 34 //右键形成面 35 if (Input.GetMouseButtonDown(1)) 36 { 37 //形成面至少三点 38 if (m_enterPoints.Count > 2) 39 { 40 //调用形成多变形方法 41 CreateMesh tCreatMesh = new CreateMesh(); 42 tCreatMesh.DoCreatPloygonMesh(m_enterPoints.ToArray()); 43 44 //每次绘制完清空手动获取的点列表 45 m_enterPoints.Clear(); 46 47 } 48 49 } 50 51 } 52 }
“CreateMesh”脚本:
1 using UnityEngine; 2 using System.Collections; 3 using System.Collections.Generic; 4 5 6 // 创建自定义Mesh类 7 public class CreateMesh : MonoBehaviour { 8 9 10 /// <summary> 11 /// 生成自定义多边形方法 12 /// </summary> 13 /// <param name="s_Vertives">自定义的顶点数组</param> 14 public void DoCreatPloygonMesh(Vector3 []s_Vertives) 15 { 16 //新建一个空物体进行进行绘制自定义多边形 17 GameObject tPolygon = new GameObject("tPolygon"); 18 19 //绘制所必须的两个组件 20 tPolygon.AddComponent<MeshFilter>(); 21 tPolygon.AddComponent<MeshRenderer>(); 22 23 //新申请一个Mesh网格 24 Mesh tMesh = new Mesh(); 25 26 //存储所有的顶点 27 Vector3[] tVertices = s_Vertives; 28 29 //存储画所有三角形的点排序 30 List<int> tTriangles = new List<int>(); 31 32 //根据所有顶点填充点排序 33 for (int i = 0; i < tVertices .Length -1; i++) 34 { 35 tTriangles.Add(i); 36 tTriangles.Add(i+1); 37 tTriangles.Add(tVertices .Length -i-1); 38 } 39 40 //赋值多边形顶点 41 tMesh.vertices = tVertices; 42 43 //赋值三角形点排序 44 tMesh.triangles = tTriangles.ToArray(); 45 46 //重新设置UV,法线 47 tMesh.RecalculateBounds(); 48 tMesh.RecalculateNormals(); 49 50 //将绘制好的Mesh赋值 51 tPolygon.GetComponent<MeshFilter>().mesh = tMesh; 52 53 } 54 55 }
绘制前效果与绘制后效果:
当然,根据需要自定义取点(点数大于等于3),也可自定义添加材质达到美观效果。