x | 采样点的 X 坐标。 |
y | 采样点的 Y 坐标。 |
float Value between 0.0 and 1.0.
生成 2D 柏林噪声。
柏林噪声是在 2D 平面上生成的浮点值的伪随机图案(虽然
该方法普及到三维或更高维,不过未在 Unity 中实现)。
该噪声不包含每个点处的完全随机值,而是由
“波”组成,其值在图案中逐渐增大和减小。该噪声可以
用作纹理特效的基础,以及用于动画、生成地形高度贴图
和许多其他内容。
Perlin noise sampled in the range 0..10 (the greyscale values represent values from 0..1)
可以通过传递相应的 X 和 Y 坐标,对平面中的任何点进行采样。
相同坐标始终返回相同采样值,但是平面本质上无穷大,
因此可通过选择随机区域进行采样以便避免重复。
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
public int pixWidth;
public int pixHeight;
public float xOrg;
public float yOrg;
public float scale = 1.0F;
private Texture2D noiseTex;
private Color[] pix;
private Renderer rend;
void Start() {
rend = GetComponent<Renderer>();
noiseTex = new Texture2D(pixWidth, pixHeight);
pix = new Color[noiseTex.width * noiseTex.height];
rend.material.mainTexture = noiseTex;
}
void CalcNoise() {
float y = 0.0F;
while (y < noiseTex.height) {
float x = 0.0F;
while (x < noiseTex.width) {
float xCoord = xOrg + x / noiseTex.width * scale;
float yCoord = yOrg + y / noiseTex.height * scale;
float sample = Mathf.PerlinNoise(xCoord, yCoord);
pix[y * noiseTex.width + x] = new Color(sample, sample, sample);
x++;
}
y++;
}
noiseTex.SetPixels(pix);
noiseTex.Apply();
}
void Update() {
CalcNoise();
}
}
虽然噪声平面是二维的,但是可方便地通过图案 仅使用单条一维线(例如用于动画特效)。
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
public float heightScale = 1.0F;
public float xScale = 1.0F;
void Update() {
float height = heightScale * Mathf.PerlinNoise(Time.time * xScale, 0.0F);
Vector3 pos = transform.position;
pos.y = height;
transform.position = pos;
}
}
注意:返回值可以稍微超过 1.0f。如果 0.0 到 1.0 的范围十分重要, 则需要限制返回值。