using UnityEngine;
using System.Collections;
public class MeshTest : MonoBehaviour
{
public Texture2D texture2d;
void Start ()
{
PlaneData planeData = new PlaneData();
planeData.Width = 5.12f;
planeData.Hight = 2.56f;
planeData.widthSegments = 50;
planeData.hightSegments = 50;
planeData.PlaneName = "onePlane";
Plane plane = new Plane(planeData);
plane.PlaneGameobject.GetComponent<MeshRenderer>().material.mainTexture = texture2d;
plane.PlaneGameobject.AddComponent<PageCurl>();
}
//繪製一個包含四個頂點的面片,需要:
//1、四個頂點的座標數組
//2、三角形頂點的順序排列的數組
//3、每個頂點的法線的數組
//4、每個頂點在0-1座標範圍內的信息的數組
//5、需要MeshFiler組件
//6、需要MeshRender組件
//http://docs.unity3d.com/Manual/Example-CreatingaBillboardPlane.html
void CreatePlane()
{
//plane寬度
float width = 50f;
//plane高度
float hight = 50f;
//頂點座標數組
Vector3[] newVertices;
//三角形頂點的順序排列的數組
int[] newTriangles;
//每個頂點的法線的數組
Vector3[] newNormals;
//每個頂點在0-1座標範圍內的信息的數組
Vector2[] newUV;
//創建一個GameObject
GameObject meshObj = new GameObject("plane");
meshObj.transform.localPosition = Vector3.zero;
meshObj.transform.localScale = Vector3.one;
//添加MeshFilter組件
MeshFilter meshFilter = meshObj.AddComponent<MeshFilter>();
//添加MeshRenderer組件
MeshRenderer meshRender = meshObj.AddComponent<MeshRenderer>();
//設置一個shader
meshRender.material = new Material(Shader.Find("Sprites/Default"));
//創建一個Mesh
Mesh mesh = new Mesh();
//設置點的數組
newVertices = new Vector3[]
{
new Vector3(0, 0, 0),
new Vector3(width, 0, 0),
new Vector3(0, hight , 0),
new Vector3(width, hight, 0)
};
//一個四邊形由兩個三角形構建,兩個三角形由點構建時的點的順序
//2 + 2 +--+ 3
// |\ \ |
// | \ \|
//0 +--+ 1 + 1
//0 -> 1 -> 2
//2 -> 1 -> 3
newTriangles = new int[6];
newTriangles[0] = 0;
newTriangles[1] = 1;
newTriangles[2] = 2;
newTriangles[3] = 2;
newTriangles[4] = 1;
newTriangles[5] = 3;
//四個頂點的法線
newNormals = new Vector3[4]
{
Vector3.forward,
Vector3.forward,
Vector3.forward,
Vector3.forward
};
//四個頂點在UV座標系中的位置
newUV = new Vector2[4]
{
new Vector2(0, 0),
new Vector2(1, 0),
new Vector2(0, 1),
new Vector2(1, 1)
};
mesh.vertices = newVertices;
mesh.uv = newUV;
mesh.triangles = newTriangles;
meshFilter.mesh = mesh;
}
}
public class PlaneData
{
//plane寬度
public float Width = 1f;
//plane高度
public float Hight = 1f;
//寬度分段
public int widthSegments = 1;
//高度分段
public int hightSegments = 1;
//面片的名字
public string PlaneName = "plane";
}
public class Plane
{
PlaneData PlaneData;
public GameObject PlaneGameobject;
public Plane(PlaneData planeData)
{
PlaneData = planeData;
PlaneGameobject = CreatePlane();
}
public GameObject GetPlaneGameobject()
{
return PlaneGameobject;
}
GameObject CreatePlane()
{
int widthCount = PlaneData.widthSegments + 1;
//高上有的點數
int hightCount = PlaneData.hightSegments + 1;
//總共的三角形點數
int numTriangles = PlaneData.widthSegments * PlaneData.hightSegments * 6;
//總共的點數
int numVertices = widthCount * hightCount;
Vector3[] vertices = new Vector3[numVertices];
Vector2[] uvs = new Vector2[numVertices];
int[] triangles = new int[numTriangles];
Vector3[] newNormals = new Vector3[numVertices];
float uvFactorX = 1.0f / PlaneData.widthSegments;
float uvFactorY = 1.0f / PlaneData.hightSegments;
float scaleX = PlaneData.Width / PlaneData.widthSegments;
float scaleY = PlaneData.Hight / PlaneData.hightSegments;
//構建頂點數組 UV數組 法線數組
for (int x = 0, index = 0; x < widthCount; x++)
{
for (int y = 0; y < hightCount; y++)
{
vertices[index] = new Vector3(x * scaleX, y * scaleY, 0.0f);
uvs[index] = new Vector2(x * uvFactorX, y * uvFactorY);
newNormals[index++] = Vector3.back;
}
}
//構建點的順序的數組
for (int x = 0, index = 0; x < PlaneData.widthSegments; x++)
{
for (int y = 0; y < PlaneData.hightSegments; y++)
{
triangles[index] = x * widthCount + y;
triangles[index + 1] = x * widthCount + 1 + y;
triangles[index + 2] = (x + 1) * widthCount + y;
triangles[index + 3] = (x + 1) * widthCount + y;
triangles[index + 4] = x * widthCount + 1 + y;
triangles[index + 5] = (x + 1) * widthCount + y + 1;
index += 6;
}
}
//創建一個GameObject
GameObject meshObj = new GameObject(PlaneData.PlaneName);
meshObj.transform.localPosition = Vector3.zero;
meshObj.transform.localScale = Vector3.one;
//添加MeshFilter組件
MeshFilter meshFilter = meshObj.AddComponent<MeshFilter>();
//添加MeshRenderer組件
MeshRenderer meshRender = meshObj.AddComponent<MeshRenderer>();
//設置一個shader
meshRender.material = new Material(Shader.Find("Sprites/Default"));
//創建一個Mesh
Mesh mesh = new Mesh();
mesh.vertices = vertices;
mesh.uv = uvs;
mesh.triangles = triangles;
meshFilter.mesh = mesh;
return meshObj;
}
}
Unity Mesh
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.