3D游戏08——粒子系统

本文介绍如何在Unity中使用粒子系统创建粒子光环效果,包括粒子系统的创建、粒子属性设置及循环扩散动作实现,通过代码展示如何控制粒子的位置、颜色和动态变化。

粒子系统是模拟一些不确定、流动现象的技术。它采用许多形状简单且赋予生命的微小粒子作为基本元素来表示物体(一般由点或很小的多边形通过纹理贴图表示),表达物体的总体形态和特征的动态变化。人们经常使用粒子系统模拟的现象有火、爆炸、烟、水流、火花、落叶、云、雾、雪、尘、流星尾迹或者象发光轨迹这样的抽象视觉效果等等。

创建粒子光环

参考 http://i-remember.fr/en ,使用粒子流编程控制制作一些效果, 如“粒子光环”
在这里插入图片描述

  1. 创建粒子系统
    新建一个空对象并命名为ParticleCycle,修改Particle System组件的属性如下:
    在这里插入图片描述
    1. 创建 ParticleCycle脚本,在其中设置Particle System的基础状态:
public ParticleSystem particleSystem;
private ParticleSystem.Particle[] particlesArray;
public int seaResolution = 50;

void Start()
{
    int number = seaResolution * seaResolution;
    particlesArray = new ParticleSystem.Particle[number];
    GetParticles();
    var main = particleSystem.main;
    main.maxParticles = seaResolution * seaResolution;
    particleSystem.Emit(seaResolution * seaResolution);
    particleSystem.GetParticles(particlesArray);
}
  1. 为粒子添加极坐标位置属性
private float[] motion;
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] = motion;
            radiuses[k] = radius;
            particlesArray[k].color = colorGradient.Evaluate(zPos);
            particlesArray[k].position = new Vector3(radius * Mathf.Cos(motion),radius * Mathf.Sin(motion),zPos);
        }
    }
}
  1. 实现粒子的循环扩散动作:
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;
            motion[k] += 0.1f * Mathf.PI * Time.deltaTime;
            motion[k] = athtas[k] > 2 * Mathf.PI ? athtas[k] - 2 * Mathf.PI : motion[k];
            particlesArray[k].position = new Vector3(radiuses[k] * Mathf.Cos(motion[k]),radiuses[k] * Mathf.Sin(motion[k]),zPos);
        }
    }

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

    particleSystem.SetParticles(particlesArray, particlesArray.Length);
}
  1. 声明Gradient类,用来设置粒子的颜色
public Gradient colorGradient;
particlesArray[k].color = colorGradient.Evaluate(zPos);

项目传送门

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值