
在上一篇文章中,我们探讨了有关地形生成的理论,并决定了如何在地形中绘制体素。 现在我们准备编写代码以在游戏中实际绘制一些东西。
当我们要在运行时创建网格时,我们首先创建一个空的GameObject并添加一个脚本,让我们说“ ProceduralTerrain”。
- 路德教会的我们的救主宣布下一个高级游戏日
- 德里最佳亚克力奖杯批发商
- 大学时代的星空帽子das schlimmste教程
- 我正在从事Commodore 64游戏
- Treine seucérebroe previnadoençascom或aplicativo Peak
要绘制自定义网格,在Unity中非常简单,只需在MeshFilter
上修改MeshFilter
。
Mesh mesh = new Mesh(); GetComponent ()。mesh =网格; mesh.vertices = myVertices; mesh.triangles = myTriangles; GetComponent ()。sharedMesh =网格; //添加碰撞
就是这样,我们将网格链接到对象,然后可以根据需要在此处添加顶点,而三角形只是vertices
数组的索引来定义其顺序。 这是简单的部分,现在我们必须定义如何添加这些顶点。
从图开始
我们将使用图形模型来决定要绘制的面,因此我们可以从一个块(一个根)开始绘制,然后跳过每个邻居,并在每个邻居上反复进行相同的操作。

一个图有节点和边,节点理想地存储一个值,对我们来说,这将是每个块将要存储的数据,现在足以存储块类型为:
公共枚举BlockType { 空气, 污垢, 石 }
这些是我们在任何探索游戏中都能找到的最基本的类型, Air
只是我们的enum
表示空性的值,即null
,因为我们尚未定义类型,所以现在我们仅使用Dirt
表示存在,我们只需要地形网格物体。
现在,我希望每个块都知道它在哪里以及谁是他们的邻居,因此我在体素网格中添加了它们的位置:

通过用任意数据填充blockMap
,我们可以创建此块。 现在,让它变大并添加一些山脉。
将Perlin Noise添加到混音中
我们可以开始使用Perlin Noise算法添加一些山脉和丘陵,以创建一个高度图,在其中可以相应地填充blockMap
。
现在,您可能想知道“我们如何在不知道其工作原理的情况下使用Perlin Noise?” ,那是因为Unity已经为我们提供了一个实现! 是Mathf.PerlinNoise
。
此函数接受两个浮点数(x,y) ,并返回另一个介于0和1之间的浮点数。但是请切记, 输入值也应介于0和1之间 ,因为该实现将应用模数为1的运算,该运算将摆脱整数部分,因此,如果我们使用(0.5,0.5) , (1.5,1.5)和(2.5,2.5 )运行函数,我们将获得相同的输出。
因此,很容易将函数的输入设置为每个坐标(x,z)除以地形的总宽度和深度,因此我们总是得到不同的结果。

可爱吗? 我们的第一个Minecraft地形。 现在,使用大空间并使用flatCenter()
保持安静,我们得到了以下信息:

好吧,我们去山上,但是它们太明显了,我们需要利用事物来使世界变得更加平坦,如果可能的话,将其置于中心。 这里的问题是我们的噪音太剧烈了,在很小的距离内从0传递到1。 因此,这里的答案是通过缩减PerlinNoise的输入来扩大噪声空间,因此我们将scale
变量修改为0.07f
并且不再需要flatCenter()
函数。 给我们这样的东西:

不,我们正在得到一些漂亮的东西,我几乎已经感觉到在体素世界中。 现在,让我们做一个更大得多的地形!

糟糕! 看起来我们有一个网格可以具有的顶点限制…是有道理的,因为我不想想象跟踪例如许多顶点和面的碰撞所需的能量。 这就是为什么体素游戏倾向于将地形分成几块的原因 ,我们将不得不在此处执行相同的操作,并将地形分成大小一致的一块。