【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,並且把它每個點的坐標寫一下試試看。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM