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

本来上一篇就结束了,但是有小伙伴私信我觉得还差了很多重要的内容,比如方块如何构成了自然的地形,液体是如何流动,光照如何实现,以及红石电路,没有这些还怎么叫《我的世界》呢?

那这一篇就给大家一点启发,没有代码,只有思路(对于想真心钻研的人来讲应该够了)。

一、自然地形的生成

首先使用柏林噪音生成起伏的山脉,就跟我们前面生成的一样。

然后生成生态。

《我的世界》里的生态主要使用维诺图(Voronoi Diagram)算法来生成。

生成完生态就来生成自然的地形了,每一块区域都经过一层层地处理,放大缩小边缘过度等等处理之后,就生成了美丽的自然风景。

具体可以看这里详细分析了《我的世界》的源码 http://blog.csdn.net/xfgryujk/article/details/61915888 总共七章

二、液体的流动

玩过《我的世界》的人应该都是很喜欢它的液体系统的,水流的用处非常广泛,除了可以做成水帘装饰,还可以做自动收割机,圆石生成机等等。

我们之所以觉得这个水是一个难点,是因为我们固定的思维,认为水的主体方块跟它旁边流下去的水流是一体的,所以我们百思不得其解,觉得它的实现难度非常高(反正我真的没想到如果是一体的该怎么实现)。

然后呢,其实换一种思维,它不是一体的,它就像树苗一样。水的主体方块是树苗,树苗会变成大树,变成大树的过程不就是改变周围的方块吗?比如把原来的空气方块替换成了树干方块。

这么一想,是不是觉得非常简单?

我们只需要做几个水流的子体,然后用一个携程来处理任何一个被放置或销毁的方块周围的水方块,然后递归地生成一一对应的子体。

当然这里是一个简单的示例,它还有很多其他的各种子体,而且子体和子体相遇时应该怎么处理也需要灵活处理。

比如假设这里检测到,水四级子体的下一个Block是岩浆的三级子体,那么这里应该生成一个圆石。

三、红石电路

看了上面水的生成,你应该有点想法了吧?没错,差不多的,检测红石信号源周围的方块是不是红石电路,然后依次改变方块(或者方块的状态)。

四、光照

光照是其中最最最最最复杂的,它用到了Unity3D、数学、物理等学科非常多的知识,实现难度很大很大。

它的实现方式可以直接看知乎这个话题中王远的回答 https://www.zhihu.com/question/24459078

还有它的百科,中文的,一定要看 https://minecraft-zh.gamepedia.com/index.php?title=%E4%BA%AE%E5%BA%A6&variant=zh

然后自己先做2D的来试试看,慢慢研究,一步一步来实现。实在实现不了就放弃吧。

五、面数优化

在我的世界里,Y轴上只有一个Chunk,但是我们的不一样,我们的Y轴上还分为16个Chunk。

这么做其实不好,多增加了一层循环,在存储和网络传输的时候也会增加消耗,但是因为Unity3D在2017.3版本以前一个物体最多只能有65k个面,所以只能这样实现。

现在好了,从Unity3D2017.3版本开始,如果一个物体的面如果超过65k,就会交由32位对象来存储,这样最多就能存储4226k的面,Y轴只有一个Chunk也绰绰有余~

具体的代码我还没实现,有兴趣的自己优化一下,应该是很简单的~

完结,散花

【Unity3D】Unity3D开发《我的世界》之七、番外篇的更多相关文章

  1. Android开发之漫漫长途 Fragment番外篇——TabLayout+ViewPager+Fragment

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  2. 知识图谱实战开发案例剖析-番外篇(1)- Neo4j是否支持按照边权重加粗和大数量展示

    一.前言 本文是<知识图谱实战开发案例完全剖析>系列文章和网易云视频课程的番外篇,主要记录学员在知识图谱等相关内容的学习 过程中,提出的共性问题进行展开讨论.该部分内容原始内容记录在网易云 ...

  3. Java微信公众平台开发--番外篇,对GlobalConstants文件的补充

    转自:http://www.cuiyongzhi.com/post/63.html 之前发过一个[微信开发]系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是 ...

  4. Java微信公众平台开发【番外篇】(七)--公众平台测试帐号的申请

    转自:http://www.cuiyongzhi.com/post/45.html 前面几篇一直都在写一些比较基础接口的使用,在这个过程中一直使用的都是我个人微博认证的一个个人账号,原本准备这篇是写[ ...

  5. electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google JavaScript Style Guide代码规范

    我的electron教程系列 electron教程(一): electron的安装和项目的创建 electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google ...

  6. 番外篇!全球首个微信应用号开发教程!小程序 DEMO 视频奉上!

    大家好,我是博卡君.经过国庆节的七天假期,相信很多朋友都已经研究出自己的小程序 demo 了吧?我最近也利用休息时间关注了一下网上关于小程序开发的讨论,今天就利用这个番外篇谈谈自己对小程序的一些想法吧 ...

  7. [置顶] think in java interview番外篇-谈程序员如何修练英语

    一.程序员对英语能力的重视度和能力要求应该是在各行各业中排在比较靠前的 这样说吧,英语程度的好坏直接影响着一个程序员的编程.开发.创新能力. 道理很简单: 1. 计算机和软件是用英语创造出来的 2. ...

  8. 智能家居实践(番外篇)—— 接入 HomeKit 实现用 Siri 控制家电

    转载:智能家居实践(番外篇)—— 接入 HomeKit 实现用 Siri 控制家电 前面我写了一个系列共三篇的智能家居实践,用的是 Amazon Echo 实现语音控制,但是 Amazon Echo ...

  9. 渗透测试思路 - CTF(番外篇)

    渗透测试思路 ​ Another:影子 (主要记录一下平时渗透的一些小流程和一些小经验) CTF(番外篇) ​ 笔者是一个WEB狗,更多的是做一些WEB类型题目,只能怪笔者太菜,哭~~ 前言 ​ 本篇 ...

  10. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

随机推荐

  1. 【转】对GAMIT/GLOBK的基本认识

    1.1   GAMIT/GLOBK软件可从网络上申请下载.该软件功能强大,用途广泛,一般包括精确定位,大气层可降水汽估计和空间电离层变化分析等.后两种用途只需要用到GAMIT模块,精确定位则还需要GL ...

  2. bzoj4326 运输计划

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MB Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n ...

  3. linux的定时任务服务crond(crontab)服务

    1,Crond: Crond是linux系统中用来定期执行命令或指定程序任务的一种服务或者软件.(Centos5以后默认存在) 当优化开机自启动的时候,第一个就是crond. Crond服务默认情况( ...

  4. Go语言入门——dep入门

    本文出现了大量maven的内容,更适合java程序员阅读,如果你的语言做依赖管理的方案与maven差异很大,可能在有些地方会不理解 从很久之前go语言在依赖解决和管理方面方案的匮乏就被不少人诟病.光指 ...

  5. Ubuntu14.04 命令行下安装teamviewer

    下载teamviewer 链接:https://pan.baidu.com/s/1hs0BppM  密码:sdmk 上传到 /home/[user] cd /home/[user] 移动安装包到 /o ...

  6. 2.Ray-消息发布器与消息存储器

    消息发布器: Ray是基于Event Sourcing设计的ES/Actor框架,ESGrain状态(State)的修改.ESGrain之间的通信默认使用RabbitMQ通信.消息的发布器主要是Rab ...

  7. .NET Core 2.0 问题杂记

    一. Ubuntu 14.04 安装 1.安装之前请先删除之前的.net core 版本 命令如下: 1.1 获取安装的.net core 版本 sudo apt --installed list | ...

  8. Exchanger

    Exchanger可以在两个线程之间交换数据,只能是2个线程,不支持更多的线程之间互换数据. 当线程A调用Exchange对象的exchange()方法后,他会进入阻塞状态,直到线程B也调用了exch ...

  9. ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql' mysql> use mysql

    show databases;select user,password,host from user;我们想通过 查看存在"mysql"数据库中的user表来查看我们的msql数据 ...

  10. WPF Effect 造成的字体模糊

    WPF 里面有个Effect ,暂且可以理解为 "特效" 分类. 但是有时候使用不恰当,容易出现各种毛病. 例如: 代码如下: <StackPanel HorizontalA ...