Version: 2017.2

Mathf.PerlinNoise

切换到手册
public static float PerlinNoise (float x, float y);

参数

x 采样点的 X 坐标。
y 采样点的 Y 坐标。

返回

float Value between 0.0 and 1.0.

描述

生成 2D 柏林噪声。

柏林噪声是在 2D 平面上生成的浮点值的伪随机图案(虽然 该方法普及到三维或更高维,不过未在 Unity 中实现)。 该噪声不包含每个点处的完全随机值,而是由 “波”组成,其值在图案中逐渐增大和减小。该噪声可以 用作纹理特效的基础,以及用于动画、生成地形高度贴图 和许多其他内容。

\ 在范围 0..10 内采样的柏林噪声(灰度值表示 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 的范围十分重要, 则需要限制返回值。