首先介绍一下关于自定义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),也可自定义添加材质达到美观效果。