unity3d通过粒子系统制作火焰效果

一、制作火焰效果
整体粒子包含部分

为了做出逼真的火焰效果,整体的粒子系统包含以下三个部分


  • 火焰系统的主体
  • 火星
    燃烧产生的颗粒物,在高温下发出红光
  • 点光源
    火焰燃烧产生的光
火焰主体部分的制作

首先,找到合适的粒子贴图,该图是火焰的不同形态,共4帧。

unity urp 粒子贴图混合模式叠加 unity粒子贴图怎么制作_粒子系统

  • Renderer模块
    设置其Material,将火焰粒子贴图放入其中。
  • Texture Sheet Animation模块
    由于火焰贴图共有4帧,因此需要将其水平和垂直方向的平铺数量划分成2,设置Tiles的x和y为2。
  • main(主模块)的设置
    Duration:发射器喷粒子的时间长度
    Looping:重复持续发射粒子
    Start Lifetime:单个粒子的生命周期,这里设置为0.3到0.5之间的随机值。
    Start Speed:粒子的初始速度。
    Start Size:粒子大小,由于火焰会忽大忽小,因此设置为0.6到1之间的随机值。
    Start Rotation:粒子旋转的弧度
    Gravity Modifier:粒子所受重力,由于火焰是向上窜的,因此设置为-1.
    具体参数设置如下
  • shape模块
    radius设置为0,使得粒子产生的位置固定。
  • Force over Lifetime模块
    粒子受到的力作用,起初可以将三个方向都设置为0。之后当模拟火焰受到风的影响而偏移时,可以调整x的值。
  • Color over Lifetime模块
    设置粒子随时间而产生的颜色变化。上面的标记控制透明度的变化,下面的标记控制颜色的变化,火焰的底部偏蓝色,从底部往上,火焰会由蓝变橙红,并且粒子生命将要结束时,将会逐渐变透明。
火星的制作

各模块参数如下:

  • 主模块
  • emission
  • shape
  • size over lifetime
    由于火星在整个生命周期内,是逐渐出现并熄灭的,因此应该设置其大小变化为由小变大再变小。
光源的设置

为火焰添加一组点光源组件,设置如下:

unity urp 粒子贴图混合模式叠加 unity粒子贴图怎么制作_粒子系统_02

效果

unity urp 粒子贴图混合模式叠加 unity粒子贴图怎么制作_粒子系统_03

代码控制效果

用代码控制火焰的大小,并模拟火焰受到风的影响。
控制火焰的大小很简单,可以通过改变粒子所受的重力、光源影响的范围和光强、粒子的速率来实现大小火的切换

if(GUI.Button (new Rect (Screen.width-100, Screen.height-100, 65, 40), "大火")){
     PointLight = GetComponent<Light>();
     PointLight.range = 15;
     PointLight.intensity = 4;
     
     ps.Stop(); // Cannot set duration whilst particle system is playing
     var main = ps.main;
     main.gravityModifier = -1.3f;
     main.simulationSpeed = 1.0f;
     var em = ps.emission;
     em.rateOverTime = 25;
     ps.Play();
 }
 if(GUI.Button (new Rect (Screen.width-100, Screen.height-200, 100, 40), "小火")){
     PointLight = GetComponent<Light>();
     PointLight.range = 8;
     PointLight.intensity = 2;
     ps.Stop(); // Cannot set duration whilst particle system is playing
     var main = ps.main;
     main.gravityModifier = -0.6f;
     main.maxParticles = 10;
     main.simulationSpeed = 0.8f;
     var em = ps.emission;
     em.rateOverTime = 10;
     ps.Play();
 }

为了模拟粒子受到风后的影响,需要改变之前所提到的x方向的力,设置完x方向力后,粒子会向左/右偏移,但是粒子的角度还是垂直向上的。这是由于之前设置的Start Rotation:粒子旋转的弧度为-5到5,因此,为了更加逼真,需要修改Start Rotation的值。起初,我简单的设置Start Rotation的值如下:

main.startRotation = new ParticleSystem.MinMaxCurve(40,  50);

但当运行时,发现粒子偏转的角度与所想的不一致,并且查看运行时粒子的Start Rotation值,发现值高达几千。查阅资料后,发现:

这是因为startRotation 需要的是一个弧度值,而非角度值,在界面上赋值时, unity会自动把你给的角度值转换为弧度

因此,在代码中需要手动转换弧度和角度。

if( GUI.Button(new Rect(10 , 30 , 50 , 30) ,  "东风") ){
            ps.Stop();
			var fo = ps.forceOverLifetime;
            fo.x = new ParticleSystem.MinMaxCurve(2.5f, 3.5f);
            //fo.x = 3;
            var main = ps.main;
            main.startRotation = new ParticleSystem.MinMaxCurve(-Mathf.PI / 180 * 40, -Mathf.PI / 180 * 50);
            ps.Play();
		}
			
		if( GUI.Button(new Rect(10 , 70 , 50 , 30) ,  "西风") ){
			ps.Stop();
			var fo = ps.forceOverLifetime;
            fo.x = new ParticleSystem.MinMaxCurve(-3.5f, -2.5f);
            //fo.x = -3;
            var main = ps.main;
            main.startRotation = new ParticleSystem.MinMaxCurve(Mathf.PI / 180 * 40, Mathf.PI / 180 * 50);
            ps.Play();
		}
运行截图

unity urp 粒子贴图混合模式叠加 unity粒子贴图怎么制作_粒子系统_04