前言:最近在研究柏林噪声算法,研究了好久,今天突然看到一篇码友的文章,仅仅用了几行就生成了我想要的样子,然后我就仔细看了一下,看完之后才觉得自己好傻,原来还真有这种方法,这就是对我不好好了解方法的惩罚,经过网上的查找发现关于这个方法的文章也是特别特别少,如果一下文章中对这个函数的使用和解释有错误,请告诉我,因为我当前也属于学习阶段,虚心请教各位大佬
Mathf.PerlinNoise
Mathf.PerlinNoise 函数是 Unity 游戏引擎中用于生成 Perlin 噪声的一个内置函数。Perlin 噪声是一种伪随机数生成算法,其输出结果是平滑和连续的,这使得它非常适合用于生成自然的纹理和模式,如云彩、地形、水面波动等。
函数签名
csharppublic static float PerlinNoise(float x, float y);
这个函数接受两个浮点数参数 x 和 y,并返回一个介于 0 和 1 之间的浮点数,代表噪声值。
特点
1.平滑性
:Perlin 噪声的特点是随着输入值 x 和 y 的变化,输出值会平滑地过渡,而不是突然变化。
2.连续性
:在 x 和 y 方向上,噪声值都是连续的,这意味着在空间中移动时,噪声值会以连续的方式变化。
3.周期性
:Perlin 噪声不是真正的随机噪声,而是周期性的。这意味着,如果你对同样的 x 和 y 值进行多次计算,你会得到相同的结果。
4.无限性
:Perlin 噪声图像可以无限延长和放大,因为 x 和 y 的取值范围是 0 到 1,但实际上可以超出这个范围,而噪声图像仍然会保持其连续性和平滑性。
代码示例
以下代码是借鉴了码友的代码,我加上了自己的解释
代码没几行,都是我的注释,不需要的可以删除后使用
using UnityEngine;
public class PerlinNoiseSpawner : MonoBehaviour
{
public GameObject Par;//父物体
public GameObject gam1;//生成物体
public float x = 0;
public float y = 0;
public int a = 10;//取值范围a和b值决定地图分布形式
public int b = 10;//取值范围a和b值决定地图分布形式
public int c = 50;//取值范围决定生成地图数量
private void Start()
{
Map();
}
private void Map()
{
c = Random.Range(30, 50);//随机取值范围决定生成地图数量?数值越小,通过判断生成的方块就越少
a = Random.Range(15, 30);//随机取值范围a和b值决定地图每一块随机数的大小,数值越大,生成地图的块越大
b = Random.Range(15, 30);
for (x = 0; x < 100; x = x + 1)//生成高100行
{
for (y = 0; y < 100; y = y + 1)//生成宽100行
{
float m = x / a;//使用X除以a,附加随机数来改变柏林噪声的值,让每次生成的地图都不一样
float n = y / b;
float o = Mathf.PerlinNoise(m, n) * 100;//柏林曲线函数,生成一个0-1之间的数值,乘以100倍,
//x和y是递增,所以即使随机也是相对平滑,所以生成的柏林噪声值也会相对平滑
o = Mathf.Round(o);//取整数
Vector3 v3 = new Vector3(x, y, 9);
if (o < c)//如果取的值小于c的话,那么就生成方块,如果大于,那么就淘汰掉
{
GameObject gam = Instantiate(gam1, v3, Quaternion.identity);//实例化(名字+位置+旋转)
gam.transform.parent = Par.transform;//设置生成方块的父物体
//transform.parent指一个对象的父级对象的Transform组件
/*将m和n与随机数进行计算,并且通过柏林算法计算出0-1之间的小数然后乘100
取整之后判断计算出的柏林数是否小于一个范围,然后再生成
由于X和Y是递增,除以X和Y的a和b也是固定的,所以生成的数相对平滑
引入a和b是为了增加随机性,由于Mathf.PerlinNoise这个方法是一个伪随机
,如果输入相同的值生成的也一直是相同的
Perlin 噪声的特点是随着输入值 x 和 y 的变化,输出值会平滑地过渡。
随机值a和b,生成的数值越大,那么通过柏林方法计算生成的值也会越大,
由于柏林噪声生成的值是曲线并且平滑的,所以大于C的地方也会比较集中,
所以生成的地图块每一块也会比较庞大
*/
}
}
}
}
}