Объявление
public static float PerlinNoise(float x, float y);Параметры
x | X-координата точки выборки. |
y | Y-координата точки выборки. |
Возвращает
float Значение от 0,0 до 1,0. (Возвращаемое значение может быть немного ниже 0,0 или выше 1,0.)
Описание
Создать 2D-шум Перлина.
Шум Перлина — это псевдослучайный шаблон значений с плавающей запятой, генерируемый в двухмерной плоскости (хотя этот метод обобщает до трех и более измерений, в Unity это не реализовано). Шум не содержит полностью случайное значение в каждой точке, а скорее состоит из «волн», значения которых постепенно увеличиваются и уменьшаются по шаблону. Шум можно использовать как основу для текстурных эффектов, а также для анимации, создания карт высот ландшафта и многого другого.

Выбрать любую точку на плоскости можно, передав соответствующие координаты X и Y. Одни и те же координаты всегда будут возвращать одно и то же значение выборки, но плоскость практически бесконечна, поэтому легко избежать повторения, выбрав случайную область для выборки.
using UnityEngine;
using System.Collections;
// Создадим текстуру и заполним ее шумом Перлина.
// Попробуйте изменить значения xOrg, yOrg и масштаба в инспекторе
// в режиме воспроизведения, чтобы увидеть, как они влияют на шум.
public class ExampleScript : MonoBehaviour
{
// Width and height of the texture in pixels.
public int pixWidth;
public int pixHeight;
// The origin of the sampled area in the plane.
public float xOrg;
public float yOrg;
// The number of cycles of the basic noise pattern that are repeated
// over the width and height of the texture.
public float scale = 1.0F;
private Texture2D noiseTex;
private Color[] pix;
private Renderer rend;
void Start()
{
rend = GetComponent<Renderer>();
// Set up the texture and a Color array to hold pixels during processing.
noiseTex = new Texture2D(pixWidth, pixHeight);
pix = new Color[noiseTex.width * noiseTex.height];
rend.material.mainTexture = noiseTex;
}
void CalcNoise()
{
// For each pixel in the texture...
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[(int)y * noiseTex.width + (int)x] = new Color(sample, sample, sample);
x++;
}
y++;
}
// Copy the pixel data to the texture and load it into the GPU.
noiseTex.SetPixels(pix);
noiseTex.Apply();
}
void Update()
{
CalcNoise();
}
}
Несмотря на то, что шумовая плоскость является двухмерной, можно легко использовать только одну одномерную линию через узор, например, для анимационных эффектов.
using UnityEngine;
public class Example : MonoBehaviour
{
// "Bobbing" animation from 1D Perlin noise.
// Range over which height varies.
float heightScale = 1.0f;
// Distance covered per second along X axis of Perlin plane.
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;
}
}
Примечание. Возвращаемое значение может быть немного меньше 0,0f или немного превышать 1,0f. Возможно, вам придется ограничить возвращаемое значение, если для вас важен диапазон от 0,0 до 1,0.