转载请注明出处: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,并且把它每个点的坐标写一下试试看。