跳转至

介绍

在本教程中,我们将使用**柏林噪声**生成一些(有块状感)地形,它可以通过使用生成的数字作为每个区块的高度值来无限生成地形。

什么是柏林噪声?

柏林噪声维基百科)是由Ken Perlin开发的一种梯度噪声类型(通常实现为二维或三维函数)。

在Roblox中,它使用math.noise函数实现,该函数接受3(2个可选)参数。该函数接受数字并返回该坐标的固定柏林噪声值。

一些需要注意的事项: - 您没有传入的可选参数将被解释为0。 - 如果x、y和z都是整数,则返回值将为0。 - 对于介于0和1之间的值,返回值将在-0.5和0.5之间逐渐波动。

为什么不只是随机数?

我们之所以使用柏林噪声而不只使用随机数,是因为我们希望我们的地形是平滑和“真实的”。例如,看看这个插图:

顶部图是随机生成的,但底部使用柏林噪声以获得更平滑但仍然是随机分布。

脚本

设置

好了,搞定了所有这些,我们可以开始创建我们的随机地形生成了。

让我们从制作我们的区块开始。

我删除了地板并添加了一个大小为10,10,10的部分。在这一点上,我们的Y大小并不重要,但我们稍后会谈论它。我们可以将此区块移至ServerStorage,在那里我们将稍后检索它并使用脚本构建地形。

让我们在ServerScriptService中添加一个脚本,并开始编写我们的代码。首先,当然,引用我们的区块。然后,让我们放置一些有用的常量。

local chunk = game.ServerStorage.chunk
local gap = chunk.Size.x
local intensity = 1/200

这里的“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和