轉載請注明出處:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_02.html
這一篇的內容比較簡單,因為所有理論內容都在上一篇中講到了。但有兩點需要特別注意一下
第一點:我們在確定面的4個點的時候,一定要面朝它,跟它面對面。
第二點:你的四邊面划分2個三邊面,無論是從左上到右下划分,還是從左下到右上划分都可以。我是全部參照Unity3D中cube的各個面的划分方式來的。
貼代碼↓
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Chunk : MonoBehaviour { private Mesh mesh; //面需要的點 private List<Vector3> vertices = new List<Vector3>(); //生成三邊面時用到的vertices的index private List<int> triangles = new List<int>(); void Start() { mesh = new Mesh(); //把所有面的點和面的索引添加進去 AddFrontFace(); AddBackFace(); AddRightFace(); AddLeftFace(); AddTopFace(); AddBottomFace(); //為點和index賦值 mesh.vertices = vertices.ToArray(); mesh.triangles = triangles.ToArray(); //重新計算頂點和法線 mesh.RecalculateBounds(); mesh.RecalculateNormals(); //將生成好的面賦值給組件 GetComponent<MeshFilter>().mesh = mesh; } //前面 void AddFrontFace() { //第一個三角面 triangles.Add(0 + vertices.Count); triangles.Add(3 + vertices.Count); triangles.Add(2 + vertices.Count); //第二個三角面 triangles.Add(2 + vertices.Count); triangles.Add(1 + vertices.Count); triangles.Add(0 + vertices.Count); //添加4個點 vertices.Add(new Vector3(0, 0, 0)); vertices.Add(new Vector3(0, 0, 1)); vertices.Add(new Vector3(0, 1, 1)); vertices.Add(new Vector3(0, 1, 0)); } //背面 void AddBackFace() { //第一個三角面 triangles.Add(0 + vertices.Count); triangles.Add(3 + vertices.Count); triangles.Add(2 + vertices.Count); //第二個三角面 triangles.Add(2 + vertices.Count); triangles.Add(1 + vertices.Count); triangles.Add(0 + vertices.Count); //添加4個點 vertices.Add(new Vector3(-1, 0, 1)); vertices.Add(new Vector3(-1, 0, 0)); vertices.Add(new Vector3(-1, 1, 0)); vertices.Add(new Vector3(-1, 1, 1)); } //右面 void AddRightFace() { //第一個三角面 triangles.Add(0 + vertices.Count); triangles.Add(3 + vertices.Count); triangles.Add(2 + vertices.Count); //第二個三角面 triangles.Add(2 + vertices.Count); triangles.Add(1 + vertices.Count); triangles.Add(0 + vertices.Count); //添加4個點 vertices.Add(new Vector3(0, 0, 1)); vertices.Add(new Vector3(-1, 0, 1)); vertices.Add(new Vector3(-1, 1, 1)); vertices.Add(new Vector3(0, 1, 1)); } //左面 void AddLeftFace() { //第一個三角面 triangles.Add(0 + vertices.Count); triangles.Add(3 + vertices.Count); triangles.Add(2 + vertices.Count); //第二個三角面 triangles.Add(2 + vertices.Count); triangles.Add(1 + vertices.Count); triangles.Add(0 + vertices.Count); //添加4個點 vertices.Add(new Vector3(-1, 0, 0)); vertices.Add(new Vector3(0, 0, 0)); vertices.Add(new Vector3(0, 1, 0)); vertices.Add(new Vector3(-1, 1, 0)); } //上面 void AddTopFace() { //第一個三角面 triangles.Add(1 + vertices.Count); triangles.Add(0 + vertices.Count); triangles.Add(3 + vertices.Count); //第二個三角面 triangles.Add(3 + vertices.Count); triangles.Add(2 + vertices.Count); triangles.Add(1 + vertices.Count); //添加4個點 vertices.Add(new Vector3(0, 1, 0)); vertices.Add(new Vector3(0, 1, 1)); vertices.Add(new Vector3(-1, 1, 1)); vertices.Add(new Vector3(-1, 1, 0)); } //下面 void AddBottomFace() { //第一個三角面 triangles.Add(1 + vertices.Count); triangles.Add(0 + vertices.Count); triangles.Add(3 + vertices.Count); //第二個三角面 triangles.Add(3 + vertices.Count); triangles.Add(2 + vertices.Count); triangles.Add(1 + vertices.Count); //添加4個點 vertices.Add(new Vector3(-1, 0, 0)); vertices.Add(new Vector3(-1, 0, 1)); vertices.Add(new Vector3(0, 0, 1)); vertices.Add(new Vector3(0, 0, 0)); } }
細心的童鞋應該發現了,我們改變了添加點和添加面的索引的順序,是為了添加他們的Count,以便於下一個面的點都能一一對應。
比如我們第二個面的第一個點的索引,應該是1+前面所有面的點的Count。
這里面Top和Bottom這兩個面要特別注意一下。
代碼就是上面這么簡單,但是你自己一定要在Unity3D里建一個Cube,並且把它每個點的坐標寫一下試試看。
