【Unity3D开发⼩游戏】《我的世界游戏》Unity开发教程推荐阅读
⼀、前⾔
这套教程涵盖了Unity Mesh编程、模拟⽔算法(water simulations)、⽅块移动算法(marching-cubes)等等。这是⼀套⽐较有深度的教程,可能需要你了解⼀些Unity和C#相关的知识。
⼆、效果图
三、正⽂unity 教程
⼀、基础篇:⽣成数据块
预备开始
⾸先,我们先来创建⼀个空的项⽬,命名随意即可。
然后创建在Assets下创建⼀个⽂件夹,命名为“Scripts”,并创建三个C#脚本,如下图所⽰:
Chunk⽤于存储⽅块数据和创建⽹格,并且对⽹格进⾏渲染和碰撞;Block⽤于存放⽅块需要的信息;MeshData⽤于存储⽹格数据。
⾸先,我们要求该脚本必须包含上个组件:MeshFilter、MeshRenderer、MeshCollider。我们的数据块(就是由⼀堆⽅块组成的⼤⽅块~)需要这三个组件完成⽹格的创建和碰撞。
然后,我们有三个变量。我们有⼀个Block类型的三维数组变量 blocks,Block类⽤于存放⽅块需要的信息,因此我们这个blocks变量就是⽤于存放⼀个数据块的⽅块的信息。
chunkSize是⼀个静态变量,它⽤于表⽰我们的数据块各个⽅向的⼤⼩(就是长宽⾼的⼤⼩)。
最后我们有⼀个bool类型的变量,⽤于标志该数据块是否在每帧结束后更新。
其次有三个函数,分别为GetBlock、UpdateChunk、RenderMesh。GetBlock⽤于获取对应位置的⽅块;UpdateChunk⽤于更新数据块的⽹格数据,然后将更新的数据提供给RenderMesh去渲染。
MeshData.cs脚本:
由于这个脚本只是为了存储数据,因此不必继承⾃MonoBehaviour。
前三个变量(vertices、triangles、uv)是⽤于渲染⽹格⽤的,后两个⽤于⽹格碰撞(colVetices、colTriangles)。
同样的,Block脚本也不需要继承⾃MonoBehaviour,并且它将会是所有⽅块的基类。主要⽤于存储⽅块所需信息。
BlockData函数⽤于⽣成该⽅块的⽹格信息。
我们来设想⼀下,假如我们的数据块是有25个⽅块组成的,那么在相邻的⽅块之间,有⼀些⾯就不必渲染出来,浪费系统资源。因此,接下来让我们进⾏剔除多余⾯数的处理。
⾸先,我们需要⼀个函数去判断两个⽅块是否相邻,如果相邻则对各个⽅向的⾯进⾏剔除处理。
在那之前,让我们先定⼀个表⽰⽅向的枚举(Block脚本中):
然后让我们为Block脚本添加判断的函数:
因为Block脚本是所有⽅块类的基类,所有我们在Block脚本中对IsSolid函数没有进⾏判断处理,全部返回true。
现在让我们开始写⼀些我们的BlockData函数,在这个函数中,我们会根据当前⽅块对应⽅向上相邻⽅块的⾯进⾏剔除处理。
上图中的注释也说得很清楚了。举个栗⼦:判断当前⽅块顶上相邻的⽅块是否有底⾯,如果有则当前⽅块就不制作顶⾯,如下图分析所⽰:
接下来就是添加需要绘制对应的⾯的函数了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论