unity3d通过粒子系统制作火焰效果 您所在的位置:网站首页 如何制作粒子效果 unity3d通过粒子系统制作火焰效果

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

2023-12-25 15:11| 来源: 网络整理| 查看: 265

unity3d通过粒子系统制作火焰效果 一、制作火焰效果 整体粒子包含部分

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

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

首先,找到合适的粒子贴图,该图是火焰的不同形态,共4帧。 在这里插入图片描述

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 由于火星在整个生命周期内,是逐渐出现并熄灭的,因此应该设置其大小变化为由小变大再变小。 在这里插入图片描述 光源的设置

为火焰添加一组点光源组件,设置如下: 在这里插入图片描述

效果

在这里插入图片描述

代码控制效果

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

if(GUI.Button (new Rect (Screen.width-100, Screen.height-100, 65, 40), "大火")){ PointLight = GetComponent(); 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(); 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(); } 运行截图

在这里插入图片描述

视频链接 项目地址


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有