zoukankan      html  css  js  c++  java
  • 【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,并且把它每个点的坐标写一下试试看。

  • 相关阅读:
    Canvas技术
    线段树树状数组小结
    html5 Canvas元素
    ccpc网络邀请赛部分
    2020杭电多校
    JavaFx 绘制图形和文本(笔记)
    P4094 [HEOI2016/TJOI2016]字符串(二分+多种数据结构)
    L3-021 神坛 (30分) (计算几何最小三角形面积)
    10月28日G、H、I题
    出栈序列的合法性 (25分) 之树状数组玄学做法
  • 原文地址:https://www.cnblogs.com/shamoyuu/p/unity_minecraft_02.html
Copyright © 2011-2022 走看看