游戏开发之Unity学习(八)——粒子光环

Unity 粒子系统

粒子系统通过生成使大量的2d图像成为动画的形式模拟流体,云,火焰

使用粒子系统生成粒子光环

这里写图片描述
演示视频

创建粒子系统和粒子位置数组

新建工程和空场景,然后新建空对象并将它放在原点。这是“光环”的中心。接下来创建一个C#脚本并命名为ParticleCycle 。然后依次点击Components->Effects->Particle System添加Particle System组件。
粒子系统需要修改Duration,Start Lifetime,Start speed,Scaling Mode为下图内容:
这里写图片描述
然后打开ParticleCycle脚本,输入

public ParticleSystem particleSystem;
private ParticleSystem.Particle[] particlesArray;
public int seaResolution = 50;

void Start()
{
    int number = seaResolution * seaResolution;
    particlesArray = new ParticleSystem.Particle[number];
    //athtas = new float[number];
    //radiuses = new float[number];
    GetParticles();
    var main = particleSystem.main;
    main.maxParticles = seaResolution * seaResolution;
    particleSystem.Emit(seaResolution * seaResolution);
    particleSystem.GetParticles(particlesArray);
}

采用极坐标分配粒子位置

这里需要添加两个属性

private float[] athtas;
private float[] radiuses;

这两个属性是用来保证后面粒子旋转的正确性

void GetParticles()
{
    for (int i = 0; i < seaResolution; i++)
    {
        for (int j = 0; j < seaResolution; j++)
        {
            float radius = Random.Range(minRadius, maxRadius);
            float zPos = Mathf.PerlinNoise(i * noiseScale, j * noiseScale) * heightScale;
            float athta = Random.Range(0.0f, 360.0f) / 180f * Mathf.PI;
            int k = i * seaResolution + j;
            athtas[k] = athta;
            radiuses[k] = radius;
            particlesArray[k].color = colorGradient.Evaluate(zPos);
            particlesArray[k].position = new Vector3(radius * Mathf.Cos(athta),radius * Mathf.Sin(athta),zPos);
        }
    }
}

使所有元素能很好地流畅的循环运动

void Update()
{
    for (int i = 0; i < seaResolution; i++)
    {
        for (int j = 0; j < seaResolution; j++)
        {
            int k = i * seaResolution + j;
            float zPos = Mathf.PerlinNoise(i * noiseScale + perlinNoiseAnimX, j * noiseScale + perlinNoiseAnimY) * heightScale;
            //particlesArray[k].color = colorGradient.Evaluate(zPos);
            athtas[k] += 0.1f * Mathf.PI * Time.deltaTime;
            athtas[k] = athtas[k] > 2 * Mathf.PI ? athtas[k] - 2 * Mathf.PI : athtas[k];
            particlesArray[k].position = new Vector3(radiuses[k] * Mathf.Cos(athtas[k]),radiuses[k] * Mathf.Sin(athtas[k]),zPos);
        }
    }

    perlinNoiseAnimX += 0.01f;
    perlinNoiseAnimY += 0.01f;

    particleSystem.SetParticles(particlesArray, particlesArray.Length);
}

颜色

这里,Gradient 类用起来非常方便,只需要再添加一个变量:

public Gradient colorGradient;

Gradient声明后,把脚本拖到空对象上,就可以设置不同颜色了:
这里写图片描述
然后使用这个语句就可以了

particlesArray[k].color = colorGradient.Evaluate(zPos);

更多内容请参考:传送门

猜你喜欢

转载自blog.csdn.net/JC2474223242/article/details/80490031