Unity中利用柏林噪声(perlinnoise)制作摇摆效果
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); } }