引言
“随机”是游戏重玩价值的源泉。但计算机无法产生真正的随机,只能产生伪随机 (Pseudo-Random)。 在程序化生成 (Procedural Generation) 中,我们不仅需要随机,还需要平滑的随机,这就是噪声 (Noise) 的舞台。
1. 伪随机数 (White Noise)
最常见的 Random.Range(0, 1)
产生的是白噪声。
它的特点是:当前值与上一个值完全无关。
如果你用它来生成地形,你会得到一堆尖锐的锯齿,像地震仪的记录,而不是连绵的山脉。
float height = Random.Range(0f, 1f); // 剧烈跳变2. 柏林噪声 (Perlin Noise)
Ken Perlin 在 1983 年为电影《电子世界争霸战》发明了这种算法。 它的特点是:相近的输入产生相近的输出。 这被称为梯度噪声 (Gradient Noise)。
float height = Mathf.PerlinNoise(x * scale, y * scale); // 平滑过渡2.1 维度
- 1D 噪声: 摇晃的摄像机、起伏的沙丘。
- 2D 噪声: 地形高度图、云层纹理。
- 3D 噪声: 洞穴生成、体积云。
3. 分形噪声 (Fractal Noise)
单一的 Perlin 噪声看起来太圆润了。为了模拟真实的山脉(既有大轮廓又有小细节),我们需要叠加多个不同频率的噪声。 这称为倍频程叠加 (Octaves)。
\[ Value = \sum \frac{Noise(x \cdot 2^i)}{2^i} \]
- Frequency (频率): 采样点的距离。
- Amplitude (振幅): 高度的范围。
- Persistence (持久度): 每一层振幅的衰减率(通常是 0.5)。
总结
- Random 用于掉落率、洗牌等离散事件。
- Noise 用于地形、纹理、运动轨迹等连续变化。
- 通过叠加不同频率的噪声,可以创造出极其逼真的自然景观。