关于Unity底层Mesh网格绘制多边形的实现

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

posted @ 2017-12-07 11:17  魔卡先生  阅读(9404)  评论(0编辑  收藏  举报