Unity 脚本自定义Mesh物体形状

今天研究了一下Unity的Mesh和自定义创建一个正方体和圆形。

参考:https://www.youtube.com/watch?v=IYMQ2ErFz0s

http://www.bubuko.com/infodetail-1843291.html

在自定义Mesh本质上就是定义好你需要绘制图形的点vertices,然后根据这些点来画三角形triangles,再定义好uv(主要用来显示贴图)的坐标系就可以了。

就不多说了,其实可以直接先看第一个参考,在第一个参考的理解下去看第二个参考就可以用Mesh画出一个圆形了。

  1 using System.Collections;
  2 using System.Collections.Generic;
  3 using UnityEngine;
  4
  5 public class BuildMesh : MonoBehaviour
  6 {
  7     //参考:https://www.youtube.com/watch?v=IYMQ2ErFz0s
  8
  9     public Vector3 vertLeftTopFront = new Vector3(-1, 1, 1);
 10     public Vector3 vertLeftBottomFront = new Vector3(-1, -1, 1);
 11     public Vector3 vertLeftTopBack = new Vector3(-1, 1, -1);
 12     public Vector3 vertLeftBottomBack = new Vector3(-1, -1, -1);
 13
 14     public Vector3 vertRightTopFront = new Vector3(1, 1, 1);
 15     public Vector3 vertRightBottomFront = new Vector3(1, -1, 1);
 16     public Vector3 vertRightTopBack = new Vector3(1, 1, -1);
 17     public Vector3 vertRightBottomBack = new Vector3(1, -1, -1);
 18
 19     private void Start()
 20     {
 21         GetComponent<MeshFilter>().mesh = CreateCircleMesh(5, 30);
 22     }
 23
 24     void Update()
 25     {
 26
 27         #region vertices definition
 28         Vector3[] vertices = new Vector3[]
 29        {
 30             // front face
 31             // 渲染对象自身坐标系
 32             vertLeftTopFront, // left top front,0
 33             vertRightTopFront, // right top front,1
 34             vertLeftBottomFront, // left bottom front,2
 35             vertRightBottomFront, // right bottom front,3
 36
 37             // back face
 38             // 假设有一个箱子,把那个面面对你,那个面就是从你右上,左上,右下,左下顺序排列
 39             // 排序之后再把他转为渲染对象的本地坐标系
 40             // 所以这里第一个坐标4为right top
 41             // 其他同理
 42             vertRightTopBack, // rigth top back,4
 43             vertLeftTopBack, // left top back,5
 44             vertRightBottomBack, //right bottom back,6
 45             vertLeftBottomBack, // left bottom back,7
 46
 47             // left face
 48             vertLeftTopBack, // left top back,8
 49             vertLeftTopFront, // letf top front,9
 50             vertLeftBottomBack, // left bottom back,10
 51             vertLeftBottomFront, // letf bottom front,11
 52
 53             // right face
 54             vertRightTopFront, // right top front,12
 55             vertRightTopBack, // right top back,13
 56             vertRightBottomFront, // right bottom front,14
 57             vertRightBottomBack, // right bottom back,15
 58
 59             // top face
 60             vertRightTopFront, // right top front,16
 61             vertLeftTopFront, // left top front,17
 62             vertRightTopBack, // right top back,18
 63             vertLeftTopBack, // left top back,19
 64
 65             // bottom face
 66             vertRightBottomBack, // right bottom back,20
 67             vertLeftBottomBack, // left bottom back,21
 68             vertRightBottomFront, // right bottom front,22
 69             vertLeftBottomFront, // left bottom front,23
 70        };
 71         #endregion
 72
 73
 74         #region triangles definition
 75         int[] triangles = new int[]
 76         {
 77             // front face
 78             0,2,3, // first triangle
 79             3,1,0, // second triangle
 80
 81             // back face
 82             4,6,7, // first triangle
 83             7,5,4, // second triangle
 84
 85             // left face
 86             8,10,11, // first triangle
 87             11,9,8, // second triangle
 88
 89             // right face
 90             12,14,15, // first triangle
 91             15,13,12, // second triangle
 92
 93             // top face
 94             16,18,19, // first triangle
 95             19,17,16, // second triangle
 96
 97             // top face
 98             20,22,23, // first triangle
 99             23,21,20, // second triangle
100         };
101
102         #endregion
103
104         #region uvs
105         Vector2[] uvs = new Vector2[]
106         {
107             /**
108              * uv 可以理解为贴图的坐标
109              * uv中的每一项和vertices中的每一项都是一一对应的?
110              * 原图的左下角uv坐标定为(0,0),原图的右上角的uv坐标定位(1,1)?,
111              * 原图的其它任何一个位置按照比例都会有一个uv坐标,
112              * 比如原图的左上角的uv坐标定位(0,1),原图的右下角的UV坐标定位(1,0),
113              * 原图的中心(对角线的交点)位置为(0.5,0.5)
114             **/
115             // front face // 0,0 is bottom left , 1,1 is top right
116             new Vector2(0,1),
117             new Vector2(0,0),
118             new Vector2(1,1),
119             new Vector2(1,0),
120
121             new Vector2(0,1),
122             new Vector2(0,0),
123             new Vector2(1,1),
124             new Vector2(1,0),
125
126             new Vector2(0,1),
127             new Vector2(0,0),
128             new Vector2(1,1),
129             new Vector2(1,0),
130
131             new Vector2(0,1),
132             new Vector2(0,0),
133             new Vector2(1,1),
134             new Vector2(1,0),
135
136             new Vector2(0,1),
137             new Vector2(0,0),
138             new Vector2(1,1),
139             new Vector2(1,0),
140
141             new Vector2(0,1),
142             new Vector2(0,0),
143             new Vector2(1,1),
144             new Vector2(1,0),
145
146         };
147         #endregion
148
149         Mesh mesh = GetComponent<MeshFilter>().mesh;
150
151         mesh.Clear();
152         mesh.vertices = vertices;
153         mesh.triangles = triangles;
154         mesh.uv = uvs;
155         mesh.RecalculateNormals();
156     }
157
158     /// <summary>
159     ///
160     /// </summary>
161     /// <param name="radius">圆的半径</param>
162     /// <param name="segments">分割数</param>
163     public Mesh CreateCircleMesh(float radius, int segments)
164     {
165         // vertices definition  圆形每个点的定义
166         int vertices_count = segments + 1;
167         Vector3[] vertices = new Vector3[vertices_count];
168         // 圆形的角度范围
169         float angledegree = 360f;
170         // 将角度转换为弧度
171         float angleRad = Mathf.Deg2Rad * angledegree;
172         // 记录当前弧度
173         float angleCur = angleRad;
174         // 每切割一个三角形平均占多少弧度
175         float angledelta = angleRad / segments;
176
177         for (int i = 0; i < vertices_count; i++)
178         {
179             // 角的邻边/斜边  一般用来根据弧度求某相关边的长度
180             float cosA = Mathf.Cos(angleCur);
181             // 角的对边/斜边
182             float sinA = Mathf.Sin(angleCur);
183
184             // radius * cosA根据比例可得到对应的坐标
185             vertices[i] = new Vector3(radius * cosA, 0, radius * sinA);
186             angleCur -= angledelta;
187         }
188
189         // triangles definition
190         int triangle_count = segments * 3;
191         int[] triangles = new int[triangle_count];
192         for (int i = 0, vi = 1; i <= triangle_count - 1; i += 3, vi++)
193         {
194             triangles[i] = 0;
195             triangles[i + 1] = vi;
196             triangles[i + 2] = vi + 1;
197         }
198
199         triangles[triangle_count - 3] = 0;
200         triangles[triangle_count - 2] = vertices_count - 1;
201         triangles[triangle_count - 1] = 1;
202
203         Vector2[] uvs = new Vector2[vertices_count];
204         for (int i = 0; i < vertices_count; i++)
205         {
206             uvs[i] = new Vector2(vertices[i].x / radius / 2 + 0.5f, vertices[i].z / radius / 2 + 0.5f);
207         }
208
209         Mesh mesh = new Mesh();
210         mesh.vertices = vertices;
211         mesh.triangles = triangles;
212         mesh.uv = uvs;
213         mesh.RecalculateNormals();
214         return mesh;
215     }
216 }

BuildMesh

时间: 2024-10-13 11:19:49

Unity 脚本自定义Mesh物体形状的相关文章

[Unity实战]自定义mesh

参考链接:http://blog.csdn.net/zuoyamin/article/details/9287507 对于自定义mesh,有三点很重要: 1.顶点个数=三角形数+2:三角形顶点数=3*三角形数 2.顶点创建的顺序最好是顺时针或者逆时针创建的,这样可以大大地减少算法的复杂度 3.顶点绘制的顺序必须是顺时针或者逆时针绘制的,这样才能正确地绘制以顶点为边界点的图形,顶点绘制的顺序参考mesh.triangles using UnityEngine; using System.Colle

关于Unity实现自定义多边形图片效果

关于Unity实现自定义多边形图片效果 1.创建RawImageEditor编辑器拓展脚本(放在工程中Editor文件夹下,没有则创建) 1 /************************************************* 2 * 项目名称:动态更改图片显示边数 3 * 脚本创建人:魔卡 4 * 脚本创建时间:2018.01.27 5 * 脚本功能:RawImageEditor编辑器功能重写 6 * **************************************

Unity 脚本的执行顺序

在Unity脚本中常用到的函数就是下面这些,他们的顺序也是按照箭头的方向执行的. Awake ->OnEable-> Start -> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->OnDisable ->OnDestroy 1.Awake 用于在游戏开始之前初始化变量或游戏状态.在脚本整个生命周期内它仅被调用一次.Awake在所有对象被初始化之后调用,所以你可以安全的与其他对象对话或用诸如GameObject.

Unity脚本——01MonoBehavior

学习笔记适合新手,如有错误请指正.?号处也请各位指点下,谢谢. MonoDevelop脚本编辑器 MonoDevelop是跨平台的脚本编辑器 MonoBehavior 继承自MonoBehavior脚本从唤醒到销毁有着完整的生命周期 Awake():脚本唤醒函数,当游戏对象被创建的时候,游戏对象绑定的脚本会在该帧(frame)内执行Awake()函数,无论脚本是否处于激活(enable)状态 Start():该函数在脚本被激活的时候执行,该函数的执行同样也是在游戏对象被创建的帧里,不同的是,如果

Unity脚本中各函数成员的生命周期

在学习Unity时,掌握如何编写脚本是必须掌握的一项基本技能.但是关于Unity的游戏脚本中各函数的生命周期是怎样开始和结束的,它们的执行顺序是如何安排的?这一点我们要清楚的了解. 我们知道Unity中的脚本大多派生于MonoBehaviour类,所以可以重写MonoBehaviour类里面的方法来实现我们想要的功能.那么自定义脚本中的各函数执行顺序和MonoBehaviour里面的函数执行顺序大致是一样的. 首先介绍一下MonoBehaviour类里面的成员变量和成员函数. 1 public

unity脚本执行顺序详解

unity脚本自带函数执行顺序如下:将下面脚本挂在任意物体运行即可得到 Awake ->OnEable-> Start ->-> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->Reset -> OnDisable ->OnDestroy using UnityEngine; using System.Collections; public class timetest : MonoBehaviour

unity脚本运行顺序具体的解释

unity脚本自带函数执行顺序例如以下:将以下脚本挂在随意物体执行就可以得到 Awake ->OnEable-> Start ->-> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->Reset -> OnDisable ->OnDestroy using UnityEngine; using System.Collections; public class timetest : MonoBehavio

unity脚本自带函数执行顺序

在unity的脚本中,有大量的脚本执行按照预先确定的顺序执行的事件函数,由于篇幅有限,无法一一列举,这里只列举一些常用的自带函数的顺序,并论述他们之间的区别. 在Unity脚本中常用到的函数就是下面这些,他们的顺序也是按照箭头的方向执行的. Awake ->OnEable-> Start -> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->OnDisable ->OnDestroy 秉着实践是检验真理的唯一标准,

Unity脚本的生命周期

Unity脚本的生命周期 前言:Unity中定义了10个重要的事件函数,按照执行的先后顺序依次为以下的内容: (1):Reset:重置函数,编辑期当脚本赋值给游戏对象时触发,仅执行一次. (2):Awake:唤醒函数,最先执行的事件函数,用于优先级最高的事件处理,仅执行一次. (3):OnEnable:启用函数,当脚本启动的时候触发,随着脚本的不断启用与禁用可以执行多次. (4):Start:开始函数,一般用于给脚本字段赋初值使用,仅执行一次. (5):FixedUpdate:固定更新函数,以默