转载请注明出处:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_01.html

最近总有人问及我的游戏里跟《我的世界》一样的地形是如何实现的,所以在这里开一个系列教程总结回答一下,也算是对自己的一个梳理和记录。

一、简单分析

对《我的世界》感兴趣,且有一定Unity3D基础的人,应该都或多或少的尝试过自己去做一个吧。

有些人是用Unity3D自带的cube,然后用三层for循环,把cube堆叠起来,但是会发现游戏几乎卡爆了,根本没办法运行。

如果看过我以前换装系统教程人应该都知道,这是因为每一个cube都是独立的物体,它们的每次渲染都要执行一次drawcall,每帧几千上万的drawcall,不卡爆就怪了。

既然这样,那我们把所有的cube合并成一个物体行不行?

也不行。

因为在地底90%的面都是看不到的,这些面实际上不应该存在,也都应该删掉,否则对CPU和GPU都是极大的负担。

基于以上的原因,直接用cube是肯定不行的,那就只能我们自己通过代码来生成面,而且只生成我们需要的面,这样就没有上面的问题了。《我的世界》也是这么做的。

二、理论基础(重点)

1、法线

法线就是垂直于面的一条线,它有方向,没有大小。

法线的方向就是面朝外的方向。比如我们现在盯着显示器看,从显示器的正中心会有一条法线垂直于屏幕指向我们。

法线向外的面就是正面,相反的就是背面,一般来讲,从正面看才能看到面,背面看面是看不到的。

2、三边面和四边面

三边面就是三条边组成的面,四边面就是四条边组成的面。

三边面在三维空间中是不可扭曲的,而四边面在三维空间中可以扭曲。所以Unity里只支持三边面。其他支持四边面的软件例如3dmax在导出fbx的时候,会把四边面转换成三边面。

3、左手坐标系和右手坐标系

我们的三维坐标系,在3dmax里是右手坐标系,而在Unity里是左手坐标系。

左手坐标系和右手坐标系的区别可以看一下这个博客 http://www.cnblogs.com/mythou/p/3327046.html

4、三边面如何组成四边面

先看看上面这张非常传神的图,左边是Unity里的左手坐标系,右边是我们想在这个坐标系里生成的一个面以及它的各个点坐标。

012和230这两个三边面就组成了一个四边面。

如果我问,这个四边面有几个顶点,想必大家都会回答4个,实际上是6个,012和230这是6个顶点,不同面的顶点不公用。

要组成2个三边面可以有很多种顺序,例如012和320、012和032、023和012等等等

但是我们一般都是按照4个点的顺序来画2个三边面组成四边面,所以可选的只有【012和230、230和012】,以及【032和210、210和032】这两大类

这两类画法有什么区别呢?细心的童鞋应该已经发现,这两种方式前者是逆时针,后者是顺时针。

这种循环的方向会导致面的法线方向不同,而这个法线方向会决定这个面的朝向。

我们要确定这个法线方向其实很简单,上面说了,Unity里是左手坐标系,我们拿出左手,伸直,拇指与其他四个指头垂直,然后四指弯曲,指尖朝向循环的方向,拇指就指向法线的方向。

有没有觉得很熟悉?这和初中学过的左手螺旋定则一模一样。

由此我们得出结论,要想生成正确的面(法线指向我们),我们只能用【032和210、210和032】

这里需要注意的一点是,我们确定4个点的循环方向,和生成三边面时的循环方向无关,只要生成三边面时,用到的前4个点的index顺序没错就行了。

三、代码实现

该有的理论知识都有了,下面我们就手动生成一个面试试看

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(); //为点和index赋值
mesh.vertices = vertices.ToArray();
mesh.triangles = triangles.ToArray(); //重新计算顶点和法线
mesh.RecalculateBounds();
mesh.RecalculateNormals(); //将生成好的面赋值给组件
GetComponent<MeshFilter>().mesh = mesh;
} void AddFrontFace()
{
//添加4个点
vertices.Add(new Vector3(, , ));
vertices.Add(new Vector3(, , ));
vertices.Add(new Vector3(, , ));
vertices.Add(new Vector3(, , )); //第一个三角面
triangles.Add();
triangles.Add();
triangles.Add(); //第二个三角面
triangles.Add();
triangles.Add();
triangles.Add();
}
}

然后建一个空物体,把这个脚本拖上去,再添加MeshFilter和MeshRenderer组件,然后随便给一个Material,运行

【Unity3D】Unity3D开发《我的世界》之一、创建一个面的更多相关文章

  1. unity3d游戏开发学习之使用3dmax创建导弹模型

    在着手研究Unity3D的游戏开发时,3D模型能够考虑从unity的assets store去获取,也能够从网上搜索下载,同一时候咱们也能够尝试下自己动手去做一些简单的模型. 这里就依据unity3d ...

  2. C#程序员的春天之从零开始学习unity3D游戏开发入门教程二(创建项目及基本面板介绍)

    一项目创建: 创建项目是开发的第一步. 运行untiy之后如果是第一次运行会弹出 我们这里随便创建一个项目. 二Untiy面板介绍: 三代码编辑器的切换: 这里我安装了vs2012. 到这里开发环境基 ...

  3. Unity3D游戏开发从零单排(四) - 制作一个iOS游戏

    提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...

  4. three.js-走进3d的奇妙世界一创建一个三维场景

      一.git代码仓库地址 git clone https://github.com/josdirksen/learning-threejs-third  下载并解压 二.创建一个三维场景 如下图所示 ...

  5. 【Xamarin开发 Android 系列 8】 创建一个Json读取数据应用(上)

    后续将内容贴上来...........

  6. Unity3D游戏开发之粒子系统实现具体解释

     今天为大家分享的是Unity3D中的粒子系统.粒子系统通经常使用来表现烟雾.云等高级效果.是一个十分注重制作技巧的部分.今天我们将以一个气泡的演示实例来一起学习怎样在Unity3D中使用粒子系统 ...

  7. cocos2d-x游戏开发(二)之创建第一个项目

    配置好开发环境之后,尝试创建一个cocos项目 (1)打开cocos2d-x安装目录,如D:\DIY\cocos2d-x-3.3 看到目录下有可执行文件 download-deps 以及 setup ...

  8. Revit API创建一个拷贝房间内对象布局命令

    本课程演示创建一个拷贝房间内对象布局命令,完整演示步骤和代码.这个命令把选中房间内的对象复制到其它选中的一个或多个房间中,而且保持与源房间一致的相对位置.通过本讲座使听众知道创建一个二次开发程序很简单 ...

  9. Framework7 - 入门教程(安装、配置、创建一个H5应用)

    1,Framework7介绍 (1)Framework7 是一个开源免费的框架.可以用来开发混合移动应用(原生和 HTML 混合)或者开发 iOS & Android 风格的 WEB APP. ...

  10. 【淡墨Unity3D Shader计划】一间 创建一个游戏场景 &amp; 第一Shader写作

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

随机推荐

  1. 【转】 要做linux运维工程师的朋友,必须要掌握以下几个工具才行

          本人是linux运维工程师,对这方面有点心得,现在我说说要掌握哪方面的工具吧 说到工具,在行外可以说是技能,在行内我们一般称为工具,就是运维必须要掌握的工具. 我就大概列出这几方面,这样入 ...

  2. 企业级Docker私有仓库部署(https)

    部署环境 Centos7.3 x64 docker-ce-17.06.0 docker-compose-1.15.0 Python-2.7.5(系统默认) 部署目标 使用HTTPS协议 支持Clair ...

  3. 细数Python Flask微信公众号开发中遇到的那些坑

    最近两三个月的时间,断断续续边学边做完成了一个微信公众号页面的开发工作.这是一个快递系统,主要功能有用户管理.寄收件地址管理.用户下单,订单管理,订单查询及一些宣传页面等.本文主要细数下开发过程中遇到 ...

  4. IE7、IE8不兼容js trim函数的解决方法

    IE兼容,有时候让人头疼,但又不得不去解决. 先看看一下代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xh ...

  5. 分析AJAX抓取今日头条的街拍美图并把信息存入mongodb中

    今天学习分析ajax 请求,现把学得记录, 把我们在今日头条搜索街拍美图的时候,今日头条会发起ajax请求去请求图片,所以我们在网页源码中不能找到图片的url,但是今日头条网页中有一个json 文件, ...

  6. Matplotlib快速入门笔记

    我正以Python作为突破口,入门机器学习相关知识.出于机器学习实践过程中的需要,快速了解了一下matplotlib绘图库.下图是我学习过程中整理的一些概念. 本文将以该图为线索梳理相关概念. 简介 ...

  7. ES6知识点大汇总

    1 //1.搭建ES6的开发环境: 2 let a=1; 3 console.log(a); 4 //2.var 声明的是全局变量 全局变量会污染外部的区块 5 //let 局部变量 6 //cons ...

  8. bzoj 4870: [Shoi2017]组合数问题 [矩阵乘法优化dp]

    4870: [Shoi2017]组合数问题 题意:求 \[ \sum_{i=0}^{n-1} \binom{nk}{ik+r} \mod p \] \(n \le 10^9, 0\le r < ...

  9. HDU Be the Winner [Anti-SG]

    传送门 n堆,每次拿走至少一个,剩下的可以分成两堆.最后拿的人输 打表观察发现和Nim游戏一样...裸Anti-SG啊 #include <iostream> #include <c ...

  10. HoloLens开发手记-世界坐标系 Coordinate systems

    坐标系 Coordinate systems 全息的核心是,全息应用可以在真实世界中放置全息图形并使得它们看起来和听起来像真实的物体.这涉及到了物体在真实世界中的定位和方向的确定,这对用户来说很重要. ...