【Unity3D】Unity3D开发《我的世界》之二、创建一个立方体

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

原文地址:https://www.cnblogs.com/shamoyuu/p/unity_minecraft_02.html