介绍¶
在本教程中,我们将使用**柏林噪声**生成一些(有块状感)地形,它可以通过使用生成的数字作为每个区块的高度值来无限生成地形。
什么是柏林噪声?¶
柏林噪声(维基百科)是由Ken Perlin开发的一种梯度噪声类型(通常实现为二维或三维函数)。
在Roblox中,它使用math.noise函数实现,该函数接受3(2个可选)参数。该函数接受数字并返回该坐标的固定柏林噪声值。
一些需要注意的事项: - 您没有传入的可选参数将被解释为0。 - 如果x、y和z都是整数,则返回值将为0。 - 对于介于0和1之间的值,返回值将在-0.5和0.5之间逐渐波动。
为什么不只是随机数?¶
我们之所以使用柏林噪声而不只使用随机数,是因为我们希望我们的地形是平滑和“真实的”。例如,看看这个插图:

顶部图是随机生成的,但底部使用柏林噪声以获得更平滑但仍然是随机分布。
脚本¶
设置¶
好了,搞定了所有这些,我们可以开始创建我们的随机地形生成了。
让我们从制作我们的区块开始。

我删除了地板并添加了一个大小为10,10,10的部分。在这一点上,我们的Y大小并不重要,但我们稍后会谈论它。我们可以将此区块移至ServerStorage,在那里我们将稍后检索它并使用脚本构建地形。
让我们在ServerScriptService中添加一个脚本,并开始编写我们的代码。首先,当然,引用我们的区块。然后,让我们放置一些有用的常量。
这里的“gap”(稍后我将解释强度)的想法是,在创建区块网格的计算中,我们将在一个区块和另一个区块之间使用它,这只是一个空间,将位于一个区块和另一个区块之间。通过以这种方式定义它,我们还可以在任何时候更改我们的区块大小,同时保持地形的无缝性(至少在x和y大小相同时)。
网格¶
让我们在这里制作一个嵌套的for循环,以生成这些区块的网格。
for xOffset = -50, 50 do
for yOffset = -50, 50 do
local height = 0
local clone = chunk:Clone()
clone.Position = Vector3.new(xOffset * gap, height, yOffset * gap)
clone.Parent = workspace
end
end

这比之前定义我们的常量更多一些代码,所以让我把它分解一下。 1. 我们的嵌套for循环,从-50到50得到了我们的x和y值,让我们通过将其乘以间隙来获取我们的区块位置。 2. 我们设置了一个高度变量,这是我们稍后将要使用的惊喜工具。 3. 我们克隆了来自ServerStorage的区块,并将其x和y设置为当前嵌套循环的值,乘以间隙。 4. 我们将克隆的区块的父级设置为workspace,并重复直到我们的所有1000个区块完成。
就个人而言,为了使代码更加清晰简洁,我会将这段代码重构为一个函数,该函数只需接受我们要创建的网格的边长和一个中心点即可,因此我们可以继续执行以下操作。
function createGrid(sideLength: number, centerPoint: Vector3)
local half = sideLength/2
for xOffset = -half, half do
for yOffset = -half, half do
local coordinates = {
x = centerPoint.X + xOffset * gap;
y = centerPoint.Z + yOffset * gap
}
local height = 0
local clone = chunk:Clone()
clone.Position = Vector3.new(coordinates.x, centerPoint.Y + height, coordinates.y)
clone.Parent = workspace
end
end
end
Info
如果您不理解函数参数旁边的奇怪内容,请不要介意,这只是确保我们传入的参数是正确类型的Luau 类型检查。
您可能会注意到我添加了坐标表,这是因为我们将需要这些x和z坐标不仅用于克隆的位置,还将在稍后使用噪声函数时使用它们。数学也稍微改变了一下,我们需要将中心点的组成部分添加到x和