Unity中 mesh生成斜坡的示例代碼
Mesh概念:
Mesh是Unity中的一個組件,稱為網(wǎng)格組件。通俗的講,Mesh是指模型的網(wǎng)格,3D模型是由多邊形拼接而成,而多邊形實際上是由多個三角形拼接而成的。所以一個3D模型的表面其實是由多個彼此相連的三角面構(gòu)成。三維空間中,構(gòu)成這些三角形的點和邊的集合就是Mesh。
Mesh組成:
1、頂點坐標(biāo)數(shù)組vertexes
2、頂點在uv坐標(biāo)系中的位置信息數(shù)組uvs
3、三角形頂點順時針或者逆時針?biāo)饕龜?shù)組triangles
4、MeshFiler組件,用于增加mesh屬性
5、MeshRender組件,增加材質(zhì)并渲染出來。
6、可能還需要每個頂點的法線的數(shù)組normals
/* /// 功能: /// 時間: /// 版本: */ using System.Collections; using System.Collections.Generic; using UnityEngine; public class MeshCreater : MonoBehaviour { public Vector3 eulerAngles; [Header("斜坡尺寸")] public float sizeX; public float sizeY; public float sizeZ; [Header("斜坡后面的立方體尺寸")] public float planeSize; public float m_angle; public Material material; Vector3[] vertices = new Vector3[54]; Vector2[] uvs = new Vector2[54]; List<int> allTris = new List<int>(); Vector3[] allPoint; GameObject gameObject; private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { DrawMesh(m_angle); } } public void DrawMesh(float angle) { if (gameObject != null) { Destroy(gameObject); } sizeX = sizeY * Mathf.Tan(angle * Mathf.PI / 180); gameObject = new GameObject("Cube"); gameObject.transform.eulerAngles = eulerAngles; var mf = gameObject.AddComponent<MeshFilter>(); var mr = gameObject.AddComponent<MeshRenderer>(); allPoint = new[] { //斜坡 new Vector3(0, 0, 0), new Vector3(0, 0, sizeZ), new Vector3(sizeX, 0, sizeZ), new Vector3(sizeX, 0, 0), new Vector3(0, sizeY, 0), new Vector3(0, sizeY, sizeZ), //斜坡后的立方體 new Vector3(0,-planeSize,0), new Vector3(sizeX,-planeSize,0), new Vector3(sizeX,-planeSize,sizeZ), new Vector3(0,-planeSize,sizeZ), }; //斜坡 vertices[0] = allPoint[0]; //正面 vertices[1] = allPoint[4]; vertices[2] = allPoint[3]; vertices[3] = allPoint[0]; //底面1 vertices[4] = allPoint[3]; vertices[5] = allPoint[2]; vertices[6] = allPoint[0];//底面1 vertices[7] = allPoint[2]; vertices[8] = allPoint[1]; vertices[9] = allPoint[1]; //背面1 vertices[10] = allPoint[4]; vertices[11] = allPoint[0]; vertices[12] = allPoint[4];//背面2 vertices[13] = allPoint[1]; vertices[14] = allPoint[5]; vertices[15] = allPoint[5]; //反面 vertices[16] = allPoint[1]; vertices[17] = allPoint[2]; vertices[18] = allPoint[2]; //斜坡1 vertices[19] = allPoint[3]; vertices[20] = allPoint[4]; vertices[21] = allPoint[2]; //斜坡1 vertices[22] = allPoint[4]; vertices[23] = allPoint[5]; //斜坡后的立方體 vertices[24] = allPoint[6]; vertices[25] = allPoint[0]; vertices[26] = allPoint[3]; vertices[27] = allPoint[6]; vertices[28] = allPoint[3]; vertices[29] = allPoint[7]; vertices[30] = allPoint[6]; vertices[31] = allPoint[9]; vertices[32] = allPoint[0]; vertices[33] = allPoint[0]; vertices[34] = allPoint[9]; vertices[35] = allPoint[1]; vertices[36] = allPoint[7]; vertices[37] = allPoint[3]; vertices[38] = allPoint[8]; vertices[39] = allPoint[8]; vertices[40] = allPoint[3]; vertices[41] = allPoint[2]; vertices[42] = allPoint[7]; vertices[43] = allPoint[8]; vertices[44] = allPoint[9]; vertices[45] = allPoint[7]; vertices[46] = allPoint[9]; vertices[47] = allPoint[6]; vertices[48] = allPoint[1]; vertices[49] = allPoint[9]; vertices[50] = allPoint[8]; vertices[51] = allPoint[1]; vertices[52] = allPoint[8]; vertices[53] = allPoint[2]; for (int i = 0; i < vertices.Length; i++) { allTris.Add(i); } uvs[0] = new Vector2(0, 0); uvs[1] = new Vector2(0, 1); uvs[2] = new Vector2(1, 0); uvs[3] = new Vector2(0, 0); uvs[4] = new Vector2(1, 0); uvs[5] = new Vector2(1, 1); uvs[6] = new Vector2(0f, 0f); uvs[7] = new Vector2(1f, 1f); uvs[8] = new Vector2(0f, 1f); uvs[9] = new Vector2(0, 1); uvs[10] = new Vector2(1, 0); uvs[11] = new Vector2(0, 0); uvs[12] = new Vector2(1, 0); uvs[13] = new Vector2(0, 1); uvs[14] = new Vector2(1, 1); uvs[15] = new Vector2(0f, 1f); uvs[16] = new Vector2(0, 0); uvs[17] = new Vector2(1, 0); uvs[18] = new Vector2(1f, 1f); uvs[19] = new Vector2(1f, 0f); uvs[20] = new Vector2(0f, 0f); uvs[21] = new Vector2(1, 1); uvs[22] = new Vector2(0, 0); uvs[23] = new Vector2(0, 1); uvs[24] = new Vector2(1, 1); uvs[25] = new Vector2(0, 0); uvs[26] = new Vector2(0, 1); uvs[27] = new Vector2(1, 1); uvs[28] = new Vector2(0, 0); uvs[29] = new Vector2(0, 1); uvs[30] = new Vector2(1, 1); uvs[31] = new Vector2(0, 0); uvs[32] = new Vector2(0, 1); uvs[33] = new Vector2(1, 1); uvs[34] = new Vector2(0, 0); uvs[35] = new Vector2(0, 1); uvs[36] = new Vector2(1, 1); uvs[37] = new Vector2(0, 0); uvs[38] = new Vector2(0, 1); uvs[39] = new Vector2(1, 1); uvs[40] = new Vector2(0, 0); uvs[41] = new Vector2(0, 1); uvs[42] = new Vector2(1, 1); uvs[43] = new Vector2(0, 0); uvs[44] = new Vector2(0, 1); uvs[45] = new Vector2(1, 1); uvs[46] = new Vector2(0, 0); uvs[47] = new Vector2(0, 1); uvs[48] = new Vector2(1, 1); uvs[49] = new Vector2(0, 0); uvs[50] = new Vector2(0, 1); uvs[51] = new Vector2(1, 1); uvs[52] = new Vector2(0, 0); uvs[53] = new Vector2(0, 1); Mesh mesh = new Mesh(); mesh.vertices = vertices; mesh.uv = uvs; mesh.triangles = allTris.ToArray(); mr.material = material; mesh.RecalculateTangents(); mesh.RecalculateNormals(); mesh.RecalculateBounds(); mf.mesh = mesh; } private void OnDrawGizmos() { if (allPoint != null) { for (int i = 0; i < allPoint.Length; i++) { Gizmos.color = Color.yellow; Gizmos.DrawSphere(allPoint[i], 0.1f); } } } }
以上就是Unity中 mesh生成斜坡的示例代碼的詳細內(nèi)容,更多關(guān)于Unity mesh斜坡的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#托管內(nèi)存與非托管內(nèi)存之間的轉(zhuǎn)換的實例講解
在本篇文章里小編給大家整理了關(guān)于C#托管內(nèi)存與非托管內(nèi)存之間的轉(zhuǎn)換的實例以及相關(guān)知識點,需要的朋友們學(xué)習(xí)下。2019-08-08c#多線程中Lock()關(guān)鍵字的用法小結(jié)
本篇文章主要是對c#多線程中Lock()關(guān)鍵字的用法進行了詳細的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01C# SynchronizationContext以及Send和Post使用解讀
這篇文章主要介紹了C# SynchronizationContext以及Send和Post使用解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05