Unity_粒子特效

来源:互联网 发布:c语言程序实例大全pdf 编辑:程序博客网 时间:2024/05/16 23:48

简单的将Particle System 的参数在Inspector上进行修改就能实现,火焰,爆炸,等这种于一中心点进行线性播放的粒子特效,效果图和参数图如下:
爆炸:这里写图片描述
这里写图片描述
这里写图片描述

火焰(因为没有太匹配的火焰材质这里用心形图片来代替实现火焰颜色的上升大小的变化):这里写图片描述
这里写图片描述
这里写图片描述

对于一些需要粒子进行特殊排布的粒子特效我们就需要进行代码编写来进行规律排布了。
例如:圆形彩光圈的实现流程。
首先创建Particle System,进行一些必要设置(例如:是否循环播放之类的),
粒子的产生就用代码控制,控制的本质就是位置(也就是旋转角度和旋转半径)

代码直接奉上:

using UnityEngine;using System.Collections;public class particleSettings{    public float angle { get; set; }    public float radius { get; set; }    public float speed { get; set; }    public particleSettings(float r)    {        this.radius = r;        this.angle = Random.value * 2 * Mathf.PI;        this.speed = Random.value * Mathf.Sqrt(radius);    }    public Vector3 getPosition()    {        return radius * new Vector3(Mathf.Cos(angle), 0, Mathf.Sin(angle));    }    public void rotate()    {        this.angle += Time.deltaTime * speed / 10;        if (this.angle > 2 * Mathf.PI)            this.angle -= 2 * Mathf.PI;        this.radius += Random.value * 0.2f - 0.1f;        if (this.radius > ParticleSea.MaxRadius)            this.radius = ParticleSea.MaxRadius;        if (this.radius < ParticleSea.MinRadius)            this.radius = ParticleSea.MinRadius;    }}
using UnityEngine;using System.Collections;public class ParticleSea : MonoBehaviour{    public new ParticleSystem particleSystem;    private ParticleSystem.Particle[] particlesArray;    private particleSettings[] psetting;    public int seaResolution = 25;    public static float MaxRadius = 120f;    public static float MinRadius = 50f;    public float radius = 100.0f;    public Gradient colorGradient;    void Start()    {        particlesArray = new ParticleSystem.Particle[seaResolution * seaResolution];        psetting = new particleSettings[seaResolution * seaResolution];        particleSystem.maxParticles = seaResolution * seaResolution;        particleSystem.Emit(seaResolution * seaResolution);        particleSystem.GetParticles(particlesArray);        setInitialPosition();    }    void Update()    {        RotateParticles();        changeColor();        particleSystem.SetParticles(particlesArray, particlesArray.Length);    }    //控制粒子旋转    void RotateParticles()    {        for (int i = 0; i < seaResolution; i++)        {            for (int j = 0; j < seaResolution; j++)            {                psetting[i * seaResolution + j].rotate();                particlesArray[i * seaResolution + j].position = psetting[i * seaResolution + j].getPosition();            }        }    }    void setInitialPosition()    {        for (int i = 0; i < seaResolution; i++)        {            for (int j = 0; j < seaResolution; j++)            {                psetting[i * seaResolution + j] = new particleSettings(radius);                particlesArray[i * seaResolution + j].position = psetting[i * seaResolution + j].getPosition();            }        }        particleSystem.SetParticles(particlesArray, particlesArray.Length);    }    void changeColor()    {        for (int i = 0; i < seaResolution; i++)        {            for (int j = 0; j < seaResolution; j++)            {                float value = (Time.realtimeSinceStartup - Mathf.Floor(Time.realtimeSinceStartup));                value += psetting[i * seaResolution + j].angle / 2 / Mathf.PI;                while (value > 1)                    value--;                particlesArray[i * seaResolution + j].color = colorGradient.Evaluate(value);                //particlesArray [i * seaResolution + j].color = colorGradient.Evaluate (Random.value);            }        }    }}

效果图如下:
这里写图片描述
这里写图片描述

这里写图片描述

原创粉丝点击