perlinnoise是unity中Mathf下的一個函數,需要兩個float參數x和y進行采樣,返回一個0-1的float型。
項目里經常要隨機搖擺某些東西,比如攝像機,某個隨機運動的目標等等,都可以用這個函數來搞定。
下面是代碼,掛載到對象上即可使用,目前返回值是一個Vector2,需要的話可以在方法里可以多加一個返回V3
using UnityEngine; public class wiggle : MonoBehaviour { [Range(0, 100)] public float amplitude = 1; //搖擺的幅度 [Range(0.00001f, 0.99999f)] public float frequency = 0.98f; //頻率 [Range(1, 4)] public int octaves = 2; //頻程迭代次數 [Range(0.00001f, 5)] public float hold = 0.2f; //保持(限制)效果 void Update() { transform.position = Shake2D(amplitude, frequency, octaves, hold, Time.time); } public static Vector2 Shake2D(float amplitude, float frequency, int octaves, float holding, float time) { float valX = 0; float valY = 0; float iAmplitude = 1; float iFrequency = frequency; float maxAmplitude = 0; float lacunarity = 20; for (int i = 0; i < octaves; i++) { //計算頻率 float noiseFrequency = time / (1 - iFrequency) / 10; //采樣x和y的值 float perlinValueX = Mathf.PerlinNoise(noiseFrequency, 0.5f); float perlinValueY = Mathf.PerlinNoise(0.5f, noiseFrequency); //*2 - 1 是為了保持參數范圍是從 -1 到 1. perlinValueX = perlinValueX * 2 - 1; perlinValueY = perlinValueY * 2 - 1; valX += perlinValueX * iAmplitude; valY += perlinValueY * iAmplitude; //振幅,計算最大振幅以便歸一化 maxAmplitude += iAmplitude; iAmplitude *= holding; iFrequency *= lacunarity; } //歸一化 valX /= maxAmplitude; valY /= maxAmplitude; //擴大幅度 valX *= amplitude; valY *= amplitude; return new Vector2(valX, valY); } }