2014-07-27 11:19:45 u013289188 阅读数 4980
  • Unity粒子特效:制作火焰效果

    粒子特效在Unity开发中,意义非凡,是改善用户视觉体验的不可或缺的技术手段。本视频主要以实战的方式,讲解、演示火焰效果的制作过程。本视频讲解的火焰效果特点: 1、基于真实火焰效果解析、实现;2、非常舒适的视觉体验;3、适合大多数3d/2d游戏;

    23 人正在学习 去看看 齐行超

粒子特效


粒子特效的原理是将若干粒子无规则的组合在一起,来模拟火焰,爆炸,水滴,雾气等效果。要使用粒子特效首先要创建,在hierarchy视图中点击create——particle system即可



粒子发射器

粒子发射器是用于设定粒子的发射属性,比如说粒子的大小,数量和速度等。在创建完粒子对象后,在右侧inspector视图中便可以看到所有的粒子属性:


emit:是否是使用粒子发射器。

min size:粒子最小尺寸。

max size:粒子最大尺寸。

min energy:粒子的最小生命周期,单位秒,表示N秒后粒子消失。

max energy:粒子的最大生命周期,单位秒,表示N秒后粒子消失。

min emission:粒子每秒生成的最小数量。

max emission:粒子每秒生成的最大数量。

world velocity:粒子在3D世界中各轴的速度。

local velocity:粒子自身坐标系中各个轴的移动速度。

rnd velocity:各个轴粒子的随机速度。

emitter velocity scale:粒子继承发射的速度。

tangent velocity:粒子发射切线的速度。

angular velocity:粒子发射的角速度。

rnd angular velocity:粒子的随机角速度。

rnd rotation:粒子是否随机旋转。

simulate in worldspace:是否在世界坐标中模拟粒子。

one shot:选择后,粒子只发送一次,否则粒子将连续发送。

ellipsoid:粒子产生的所有轴的位置。

min emitter range:设定粒子之间的间隙。


粒子动画

粒子动画用于设定粒子渲染中的动画效果,首先简单的介绍粒子动画中各个属性:


does animate color:是否开启粒子动画的颜色,颜色将根据自身的生命周期改变。

color animation[ n ]:设置动画渐变数组中的颜色,这个数组长5,也就是说粒子的颜色发生改变时,循环这5个颜色。

world rotation axis:粒子围绕世界坐标轴旋转。

local rotation axis:粒子围绕着本地空间轴旋转。

size grow:粒子成长的生命周期。

rnd force:粒子运行时,每经过一帧就在粒子上加一个随机的力。

force:粒子运行是,每经过一帧就在粒子上加一个固定的力。

damping:阻力,用于减慢粒子。

autodestruct:自动销毁粒子动画对象。



粒子渲染器

粒子渲染器主要用于粒子的渲染,如:渲染模式,粒子的缩放,粒子的尺寸等


cast shadows:是否投射粒子的阴影。

receive shadows:是否接受粒子的阴影。

materials:粒子显示的材质。

camera velocity scale:相机缩放的速度。

stretch particles:粒子的显示状态,如横向或纵向。

length scale:粒子缩放的长度。

velocity scale:粒子缩放的速度。

max particle size:粒子最大的尺寸。

uv animation:设置粒子动画水平方向上的数量与垂直方向上的数量以及播放贴图动画。



粒子效果实例

unity为粒子提供了很不错的标准包,在project视图右键弹出import package——particles,导入粒子标准包,里面有很多现成的粒子材质。


using UnityEngine;
using System.Collections;

public class Script_06_11 : MonoBehaviour 
{

	//粒子对象
	GameObject particle = null;
	//粒子X轴方向速度
	float velocity_x = 0.0f;
	//粒子Y轴方向速度
	float velocity_y = 0.0f;
	//粒子Z轴方向速度
	float velocity_z = 0.0f;
	
	void Start () 
	{
		//获得粒子对象
		particle = GameObject.Find("ParticleSystem");
		
	}
	
	void OnGUI()
	{
		//拖动设置粒子的最大尺寸
		GUILayout.Label("粒子最大尺寸");
		particle.particleEmitter.maxSize = GUILayout.HorizontalSlider (particle.particleEmitter.maxSize, 0.0f, 10.0f,GUILayout.Width(150));
		
		//拖动设置粒子的最大消失时间
		GUILayout.Label("粒子消失时间");
		particle.particleEmitter.maxEnergy = GUILayout.HorizontalSlider (particle.particleEmitter.maxEnergy, 0.0f, 10.0f,GUILayout.Width(150));
		
		//拖动设置粒子的最大生成数量
		GUILayout.Label("粒子的最大生成数量");
		particle.particleEmitter.maxEmission = GUILayout.HorizontalSlider (particle.particleEmitter.maxEmission, 0.0f, 100.0f,GUILayout.Width(150));
		
		//拖动设置粒子X轴的移动速度
		GUILayout.Label("粒子x轴的移动速度");
		velocity_x= GUILayout.HorizontalSlider (velocity_x, 0.0f, 10.0f,GUILayout.Width(150));
		particle.particleEmitter.worldVelocity = new Vector3(velocity_x, particle.particleEmitter.worldVelocity.y, particle.particleEmitter.worldVelocity.z);
		
		//拖动设置粒子Y轴的移动速度
		GUILayout.Label("粒子y轴的移动速度");
		velocity_y= GUILayout.HorizontalSlider (velocity_y, 0.0f, 10.0f,GUILayout.Width(150));
		particle.particleEmitter.worldVelocity = new Vector3( particle.particleEmitter.worldVelocity.x,velocity_y, particle.particleEmitter.worldVelocity.z);
		
		//拖动设置粒子Z轴的移动速度
		GUILayout.Label("粒子z轴的移动速度");
		velocity_z= GUILayout.HorizontalSlider (velocity_z, 0.0f, 10.0f,GUILayout.Width(150));
		particle.particleEmitter.worldVelocity = new Vector3( particle.particleEmitter.worldVelocity.x, particle.particleEmitter.worldVelocity.y,velocity_z);
	
	
	}
}
运行:




2019-07-09 15:51:17 w962942172 阅读数 289
  • Unity粒子特效:制作火焰效果

    粒子特效在Unity开发中,意义非凡,是改善用户视觉体验的不可或缺的技术手段。本视频主要以实战的方式,讲解、演示火焰效果的制作过程。本视频讲解的火焰效果特点: 1、基于真实火焰效果解析、实现;2、非常舒适的视觉体验;3、适合大多数3d/2d游戏;

    23 人正在学习 去看看 齐行超

Unity3D学习笔记:粒子特效参数含义

转载 https://blog.csdn.net/asd237241291/article/details/8433534

粒子特效

粒子系统检视面板

初始化模块:
持续时间(Duration):粒子系统发射粒子的持续时间
循环(Looping):粒子系统是否循环
预热(Prewarm):当looping开启时,才能启动预热(Prewarm),游戏开始时粒子已经发射了一个周期。
初始延迟(Start Delay):粒子系统发射粒子之前的延迟。注意在prewarm(预热)启用下不能使用此项。
初始生命(Start Lifetime)以秒为单位,粒子存活数量。
初始速度(Start Speed):粒子发射时的速度。
初始大小(Start Size):粒子发射时的大小。
初始旋转(Start Rotation):粒子发射时的旋转值。
初始颜色(Start Color):粒子发射时的颜色。
重力修改器(Gravity Modifier):粒子在发射时受到的重力影响。
继承速度(Inherit Velocity):---控制粒子速率的因素将继承自粒子系统的移动(对于移动中的粒子系统)。
模拟空间(Simulation Space):粒子系统在自身坐标系还是世界坐标系。
唤醒时播放(Play On Awake):如果启用粒子系统当在创建时,自动开始播放。
最大粒子数(Max Particles):粒子发射的最大数量
发射模块(Emission):

控制粒子的发射时的速率,在粒子系统存续期间可以在某个时间生成大堆粒子(模拟爆炸)。

速率(Rate):每秒的粒子发射的数量 (小箭头可选择“每秒(Time)”或“每米(Distance)”)。
突发(Bursts):在粒子系统生存期间增加爆发
爆炸的时间 | 数量(Time | Particles):指定时间(在生存期内,以秒(Time)为单位时),将发射指定数量的粒子。
									 用"+"或"-"调节爆	 ···发数量。
发射器形状模块(Shape):

发射器形状内部随机位置生成,并能提供初始的力,该力的方向将延表面法线或随机方向发射。

球体【Sphere】
半径(Radius):球体的半径。
从外壳发射(Emit from Shell):从球体外壳发射。
随机方向(Random Direction):随机方向或是沿表面法线。
半球【Hemisphere】
半径(Radius):半椭圆的半径。
从外壳发射(Emit from Shell):从半椭圆外壳发射。
随机方向(Random Direction):随机方向或是沿表面法线。
锥体【Cone】喇叭~
角度(Angle):圆锥的角度(喇叭口)。如果是0,粒子将延一个方向发射(直筒)。
半径(Radius ):发射口半径。
立方体【Box】
Box X:X轴的缩放值
Box Y:Y轴的缩放值
Box Z:Z轴的缩放值
随机方向(Random Direction):粒子将延一个随机方向发射(取消:延Z轴发射)。
网格【Mesh】
类型(Type):粒子将从顶点(Vertex)、边(Edge)、或三角面(Triangle)发射。
网格(Mesh):选择一个面作为发射面。
随机方向(Random Direction):粒子发射将随机方向或是沿表面法线。
存活时间的速度模块(Velocity Over Lifetime):

粒子的直接动画路径。(通常用于复杂物理粒子,不过是简单的视觉行为和物理世界的小互动,如与飘荡的烟雾和气温降低。)

XYZ:使用常量曲线或在曲线中随机去控制粒子的运动。
Space:局部/世界 速度值在局部还是世界坐标系。
存活期间的限制速度模块(Limit Velocity Over Lifetime):

基本上被用于模拟的拖动。如果有了确定的阀值,将抑制或固定速率。可以通过坐标轴或向量调整。
拖动指用于Taril, 一般有拖尾的时候会让粒子随着移动变小,然后形成渐变的拖尾效果。

分离轴(Separate Axis):用于每个坐标轴控制。
----速度(Speed):用常量或曲线指定来限制所有方向轴的速度。(未选中)
----XYZ:用不同的轴分别控制。见最大最小曲线。(选中)
阻尼(Dampen):(0-1)的值确定多少过度的速度将被减弱。(值为0.5,将以50%的速率降低速度)
存活期间的受力模块(Force Over Lifetime):
XYZ:使用常量或随机曲线来控制作用于粒子上面的力。
Space:Local自己的坐标系,World世界的坐标系。
随机(Randomize):每帧作用在粒子上面的力都是随机的。(两组xyz时可选择,随机范围是这两组xyz之间的差值。)
存活时间的颜色模块(Color Over Lifetime):

控制每个粒子存活期间的颜色(与初始颜色叠加)。粒子存活时间越短变化越快。
两种颜色随机比例互相叠加。
目前我用到的情况是呼吸灯的情况

颜色速度模块(Color By Speed):
使粒子颜色根据其速度动画化。为颜色在1个特定范围内重新指定速度。

颜色(Color):用于指定的颜色。使用渐变色来指定各种颜色。
颜色缩放(Color Scale):使用颜色缩放可以方便的调节纯色和渐变色。
速度范围(Speed Range):min和max值用来定义颜色速度范围。
存活时间的大小模块(Size Over Lifetime):
大小(Size):控制每个粒子在其存活期间内的大小。曲线,随机双曲线或随机范围数值。(配合Color over lifetime 实现呼吸灯效果)
存活时间的大小速度模块(Size By Speed):
大小(Size):大小用于指定速度。用曲线表示各种大小。
速度范围(Speed Range):min和max值用来定义大小速度范围。
存活期间的旋转速度模块(Rotation Over Lifetime):

以度为单位指定值。

旋转速度(Rotational Speed):控制每个粒子在其存活期间内的旋转速度。使用常量,曲线,2曲线随机。
旋转速度模块(Rotation By Speed):
旋转速度(Rotational Speed):用来重新测量粒子的速度。使用曲线表示各种速度。
速度范围(Speed Range):为min和max值用来定义旋转速度范围。
碰撞模块(Collision Module)

为粒子系统建立碰撞。现在只有平面碰撞被支持,这个将很有效率的做简单探测。

平面(Planes):Planes被定义为指定引用。可以动画化。如果多个面被使用,Y轴作为平面的法线。
阻尼(Dampen):0-1 在碰撞后变慢。
反弹(Bounce):0-1 当粒子碰撞后的反弹力度。
生命减弱(Lifetime Loss):(0-1) 每次碰撞胜铭减弱的比例。0,碰撞后粒子正常死亡。1,碰撞后粒子立即死亡。
可视化(Visualization):可视化平面:网格还是实体
-----网格(Grid):在场景渲染为辅助线框。
----实体(Solid):在场景渲染为平面。
缩放平面(Scale Plane):重新缩放平面
子粒子发射模块(Sub Emitter):

可以生成其他粒子系统,用下列的粒子事件:出生、死亡、碰撞。

出生(Birth):在每个粒子出生的时候生成其他粒子系统
死亡(Death):在每个粒子死亡的时候生成其他粒子系统
碰撞(Collision):在每个粒子碰撞的时候生成其他粒子系统。重要的 碰撞需要建立碰撞模块。见碰撞模块
纹理层动画模块(Texture Sheet Animation):

在粒子存活期间动画化UV坐标。动画每帧可以显示在表格或1个表格的每行,这样将动画分开。每帧可以用曲线动画或者在2个曲线取随机。速度被定义为"循环"、
注意:用于动画的纹理是在渲染器模块中材质找到使用的。
目前用到的是碎石效果。利用多个Sprite对象同时生成,实现碎石效果。

模型(Mode):选取Grid或者Sprite。Grid是利用整个Animation Sheet文件,
		     选取Sprites则可以添加多个Sprites并随机生成实现粒子特效
平铺(Tiles):定义纹理的平铺
动画(Animation):指定动画类型:整个表格或是单行。
----整个表(Whole Sheet):为UV动画使用整个表格。
-------时间帧(Frame over Time):在整个表格上控制UV动画。使用常量,曲线,2曲线随机。
----单行(Single Row):为UV动画使用表格单独一行。
-------随机行(Random Row):如果选择第一行随机,不选择得指定行号(第一行是0)
-------时间帧(Frame over Time):在1个特定行控制每个粒子的UV动画。使用常量,曲线,2曲线随机。
周期(Cycles):指定动画速度。
渲染器模块(Renderer):

渲染模块显示粒子系统渲染组件的属性。注意:即使一个游戏物体有渲染粒子系统组件,当此模块被删除/添加后,它的属性也只能显示在这里。这个实际上是粒子系统渲染组件的添加和删除。还可以用来调整粒子系统的坐标位置,比如世界坐标,本地坐标。

渲染模式(Render Mode):选择下列粒子渲染模式之一
----广告牌(Billboard):让粒子永远面对摄像机。
----拉伸广告牌(Stretched Billboard):粒子将通过下面属性伸缩。
	摄像机缩放(Camera Scale):决定摄像机的速度对粒子伸缩的影响程度。
	速度缩放(Speed Scale):通过比较速度来决定粒子的长度。
	长度缩放(Length Scale):通过比较宽度来决定粒子的长度。
----水平广告牌(Horizontal Billboard):让粒子延Y轴对齐,面朝Y轴方向。
----垂直广告牌(Vertical Billboard):当面对摄像机时,粒子延XZ轴对齐。
----网格(Mesh):粒子被渲染时使用mesh而不是quad。
-------网格(Mesh):渲染粒子所用的网格引用。
材质(Material):材质。
排序模式(Sort Mode):绘画顺序可通过具体,生成早优先和生成晚优先。
排序校正(Sorting Fudge):使用这个将影响绘画顺序。粒子系统带有更低sorting fudge值,更有可能被最后绘制,
						从而显示在透明物体和其他粒子系统的前面 。
投射阴影(Cast Shadows):粒子能否投影?这是由材质决定的。
接受阴影(Receive Shadows):粒子能否接受阴影?这是由材质决定的。
最大粒子大小(Max Particle Size):设置最大粒子大小,相对于视窗大小。有效值为0-1。

粒子系统检视面板
管理复杂的粒子效果,untiy提供了粒子编辑器,用户从监事面板的粒子组件面板可以点击"Open Editor"按钮。

2016-11-11 17:38:41 zhaokuo_123456 阅读数 10400
  • Unity粒子特效:制作火焰效果

    粒子特效在Unity开发中,意义非凡,是改善用户视觉体验的不可或缺的技术手段。本视频主要以实战的方式,讲解、演示火焰效果的制作过程。本视频讲解的火焰效果特点: 1、基于真实火焰效果解析、实现;2、非常舒适的视觉体验;3、适合大多数3d/2d游戏;

    23 人正在学习 去看看 齐行超

Effects:效果/特效。

     

     Particle System:粒子系统。可用于创建烟雾、气流、火焰、涟漪等效果。

     在Unity3D 3.5版本之后退出了新的shuriken粒子系统:

     

     添加组件之后的效果:

     

     其中的Open Editor按钮可以打开粒子编辑器,用于编辑复杂的粒子效果。

    

    

    由于shuriken粒子系统是模块化的管理方式,所以可以动态的添加模块:

    

    1.初始化模块:此模块是效果组件固有的模块。

    

    Duration:粒子发射器,发射粒子的时间。单位为S(秒)。

    Looping:是否开启。如果开启了循环,Duration值只要大于最小值0.10即可。

    Prewarm:是否开启预热。只有在开启的循环的时候,预热才有效果,粒子量相似发射了一个粒子周期。

    Start Delay:预热延迟。游戏开始多长时间后,预热开启。单位为S。

    Start Lifetime:粒子从发射器出来,到消失的时间。单位为S。

    Start Speed:粒子发射的速度。

    Start Size:粒子大小。

    Start Rotation:粒子的旋转角度。

    Start Color:粒子的颜色。

    Gravity Multiplier:设置重力对粒子的影响,数值越大影响越大。

    Inherit Velocity:速度继承。当粒子系统是运动的时候,粒子的速度会继承运动的速度。但粒子坐标系必须在世界坐标系。

    Simulation Space:坐标系是本身还是世界坐标系。

    Play On Awake:在游戏开始播放,但不影响Start Delay效果。

    Max Particles:粒子释放的最大数量,当达到最大数量时,停止释放粒子,当有粒子消失时继续释放。

    2.Emission Module(粒子发射模块)用于粒子发射的速率。或是某个特定时间发射大量的粒子,用于模拟爆炸的效果。

    

    每秒发射粒子数量。Bursts为某个时间点爆发出粒子的数量,这个时间必须在粒子Duration范围内。

    

    每米发射粒子数量。粒子发射器所在的游戏对象,移动的时候每米发射的粒子,但粒子坐标系必须在世界坐标系。

    3.Shape Model(形状控制模块):定义了粒子发射器的形状,位置及发射方向。

    球形粒子发射器:

    

      Radius:球形的半径。

      Emit from Shell:是否从表面发射粒子,还是从内部发射。

      Random Direction:是否启用随机速度。

      

    半球发射器:

    

      

    锥体发射器:

    

      Angle:椎体,上边开口的大小。

      Radius:半径的大小。

      Length:椎体的高度。只有当Emit from 值为Volume Shell或是Volume时可用。

      Emit From:粒子发射的位置。

      ——————Base:粒子发射源在椎体的内部的底面上,由底面开始发射。

      ——————Base Shell:粒子发射源在椎体底面的边缘,就是周长那一圈发射。

      ——————Volume:粒子发射源在椎体内部空间。

      ——————Volume Shell:粒子发射器在椎体整个表面上。没有底面。

      

    立方体发射器:

    

      Box X:立方体长度。

      

    网格发射器:

    

      Mesh:选择网格样式。

      ——————Vertex:粒子将从网格顶点发射。

      ——————Edge:粒子将从网格边缘(棱)发射。

      ——————Triangle:粒子将从网格的三角面发射。图形都是三角形组成的。

    4.生命周期速度模块:控制每一个粒子的速度。

    

    5.生命周期速度限制模块:

    

      Separate Axis:是否启用限制每一个轴。

      Speed:限制的速度。

      Dampen:阻尼。阻尼为1的时候表示在生命周期结束的时候,速度降到限定的速度。

    6.生命周期作用力模块:控制每一个粒子在生命周期内受到力的情况。

    

      Randomize:只有在Random Between Two Constants或Random Between Two Curves时才可启用。

            表示每一帧作用在粒子上的力是均匀随机产生的。

    7.生命周期颜色模块:控制每一个粒子在生命周期内颜色的变化。

    

      

    

      

    8:速度范围颜色变化控制模块:根据设置速度的范围和粒子的速度来改变粒子的颜色。

    

      

    9:生命周期粒子大小模块:控制每个粒子在生命周期内,大小的变化。

    

    

      

    10:速度范围粒子大小变化控制模块:根据速度的变化改变粒子的大小。

    

    

      

    11:生命周期每个粒子的旋转速度:每秒粒子旋转的角度。

    

      

    12:根据速度变化改变粒子的旋转速度:旋转速度不为固定常数时。

    

      

    13:外部作用力倍增数:调整风对粒子的影响情况。

    

    14:碰撞模块:为粒子创建粒子碰撞效果,目前只支持平面碰撞。

    

    平面碰撞只支持6个平面,点击+号可以添加现在有的平面或是新建立一个。

    

    通过新建立了碰撞平面,会成为粒子物体的子物体。

      

      

     Visualization:碰撞平面的显示方式。

     ——————Grid: 

     ——————Solid:

    Scale Plane:碰撞平面的大小。

    Dampen:阻尼系数。粒子速度撞击损耗程度。0~1。

    Bounce:反弹系数。0~2.系数越大,反弹角度越小。

    Min kill Speed:最小销毁速度。当速度小于这个值的时候,粒子消失。

    Particle Radius:粒子碰撞半径。最小值为0.01。

    世界碰撞:

    

    Collides With:碰撞层级。选择与那一层级碰撞。

    Collision Quality:碰撞质量。

    ——————High:每个粒子会每帧与场景做一次射线碰撞检测,需要注意的是,这样会增加CPU的负担,故在此情况下整个场景中的粒子数应当小于1000。

    ——————Medium:粒子系统在每帧会受到一次Parude Raycast Budget全局设定的影晌。

    ——————Low:与 中等效果相似 ,只 是粒子系统每4帧才受一次Parude Raycast Budget全局参数的影晌。

 

    ——————Voxel Size:碰撞缓存中的体素的尺寸,仅当Collision Quality为Medium和Low时可用。

    15:子粒子发射模块:在粒子出生,碰撞,消灭时可以调用其他粒子。

    

    

 

     16:序列帧动画纹理模块:

    

    Tiles:x水平分割的份数,y垂直分割的份数。

    Animation:Whole Sheet-整个页面即X,Y一起移动。

    Frame over Time:生命周期内,动画变幻的速率。

    Cycles:生命周期内变化几次动画。

    

    Animation:Single Row-从左到右行滚动。

    Random Row:随机行。

    Row:选择某一行,开始滚动,小于Tiles中的Y。

    17:粒子的渲染模块:

    

    Render Mode:渲染模式。

    ——————Billboard:面板渲染。

    ——————Vertical Billboard垂直渲染,此模式当面对摄像机时,粒子将与zX平面对齐

    ——————Horizontal Billboard:水平模式,此模式下粒子将沿Y轴对齐。

    ——————Stretched Billboard:拉伸渲染。

          

          ————CameraScale:相机缩放。摄像机的速度对于粒子伸缩影晌的程度。speed Scale:通过比较粒子的速度决定粒子的长度。 LengthScale:通过比较粒子的宽度决定粒子的长度。

          

    ——————Mesh:模式。

    

    

    18:属性:

    

    Resimulate:实时渲染。在改变参数的时候,场景中的粒子效果实时变化。

    Wireframe:选择时,将显示粒子的片面网格。

    

2015-05-09 15:20:28 d814617937 阅读数 6077
  • Unity粒子特效:制作火焰效果

    粒子特效在Unity开发中,意义非凡,是改善用户视觉体验的不可或缺的技术手段。本视频主要以实战的方式,讲解、演示火焰效果的制作过程。本视频讲解的火焰效果特点: 1、基于真实火焰效果解析、实现;2、非常舒适的视觉体验;3、适合大多数3d/2d游戏;

    23 人正在学习 去看看 齐行超

在Uniyt3d开发中,在UI上增加粒子特效是个很出彩的做法。但往往会遇到粒子特效与UI层次错乱的问题。下面分享一个自己的写得小的代码,轻松解决层次问题。
c#
//目标控件
public UIWidget target;
//记录上帧的RenderQueue
private int oldRQ;
void Update()
{
AdjustRQ ();//这个必须放在Update/LateUpdate/FinxUpdate里。因为NGUI的drawl更新是在lateUpdate()里的。
}
public void AdjustRQ()
{
if (target == null || target.drawCall == null)
return;
if (target.drawCall.renderQueue == oldRQ)
return;
Renderer[] rends = transform.GetComponentsInChildren<Renderer> (true);
if (rends == null)return;
for (int i=0; i<rends.Length; ++i) {
if(rends[i].material!=null)
rends[i].material.renderQueue=target.drawCall.renderQueue+1;//将renderqueue调整到目标控件之上
}
oldRQ = target.drawCall.renderQueue;
}

上面代码的使用很简单。只需要新建一个MonoBehaviour文件,代码贴进去。然后把该脚本绑定到粒子特效的预设上。target的值可以通过拖拽赋值或者代码赋值都可以。这个target就是粒子特效要显示在其上层的UI。
整个实现原理很简单。就是在运行的时候找到UI的RenderQueue然后把粒子特效的RenderQueue放在其之上就好了。其他Ui的RenderQueue比它大就会挡住它。也就可以把粒子特效当成一个UI了。当然,有时候如果特效的shader启动了深度检测,还需要调整下UI的z值。

2015-06-24 09:17:47 bitianlangyue 阅读数 1035
  • Unity粒子特效:制作火焰效果

    粒子特效在Unity开发中,意义非凡,是改善用户视觉体验的不可或缺的技术手段。本视频主要以实战的方式,讲解、演示火焰效果的制作过程。本视频讲解的火焰效果特点: 1、基于真实火焰效果解析、实现;2、非常舒适的视觉体验;3、适合大多数3d/2d游戏;

    23 人正在学习 去看看 齐行超

http://blog.csdn.net/yangyy753

原帖分享了这个工具,就不在这里重复赘述了,但是是针对老粒子特效的,并且中间有一些错误,稍微改动了下,并且添加了修改粒子数的新功能,不需要的可以去掉。

适用新粒子系统,新粒子系统中只能获得设置的最大粒子数和当前粒子数,无法获得实际运行中的最大粒子数。虽然可以运行时取得,但是并不是我们想要的方法,有好方法的可以分享下。

using UnityEngine;  
using System.Collections;  
using UnityEditor;  
using System.Collections.Generic;  
  
public class EffectEmitChecker : EditorWindow  
{  
    float ThumbnailWidth = 40;  
    float ThumbnailHeight = 40;  
    GUIStyle style = new GUIStyle();  
    Vector2 vec2 = new Vector2(0, 0);  
    List<EffectParticle> listEffect = new List<EffectParticle>();   //缓存特效信息  
  
    [MenuItem("Effect/Effect Emit Checker")]  
    static void MainTask()  
    {  
  EffectEmitChecker window = GetWindow<EffectEmitChecker>();  
        window.LoadEffect();   //加载特效  
  window.Show();  
    }  
  
    void OnGUI()  
    {  
        ListEffect();  
    }  
  
    void LoadEffect()  
    {  
  GameObject[] objs = (GameObject[])Resources.LoadAll<GameObject>("Effects");  //读取所有特效文件,可以根据情况改变地址 

        for (int i = 0; i < objs.Length; i++)  
        {  
            //GameObject go = PrefabUtility.InstantiatePrefab(objs[i]) as GameObject; //创建实例  
            if (objs[i] == null) continue; 
   ParticleSystemRenderer[] renderers = objs[i].GetComponentsInChildren<ParticleSystemRenderer>(true);  //获取特效实例下的所有ParticleRenderer组件  
   foreach (ParticleSystemRenderer render in renderers)  
   {  
                EffectParticle effect = new EffectParticle();  
                ParticleSystem emitter = render.particleSystem;   //获取ParticleEmitter组件  
                effect.name = objs[i].name;  
                effect.material = render.sharedMaterial;  
                if (emitter != null)  
    {  
                    effect.maxEmission = emitter.maxParticles;   //最大发射粒子数赋值  
               }  
    effect.prefab = emitter.gameObject;  
    listEffect.Add(effect);  
            }  
           // DestroyImmediate(go);   //销毁实例  
        }

        listEffect.Sort((x, y) => { return y.maxEmission.CompareTo(x.maxEmission); });  //从大到小排序  
        style.normal.textColor = Color.red;  
        style.fixedWidth = 120;  
    }  
  
    void ListEffect()  
    {  
        vec2 = EditorGUILayout.BeginScrollView(vec2);  
        foreach (EffectParticle effectParticle in listEffect)  
        {  
            if (effectParticle != null)  
            {  
                GUILayout.BeginHorizontal();  
  
                Material mat = effectParticle.material;  
                if (mat != null)  
                {  
                    //根据材质找到相应的纹理显示  
                    Texture texture = mat.mainTexture;  
                    if (texture != null)  
                        GUILayout.Box(texture, GUILayout.Width(ThumbnailWidth), GUILayout.Height(ThumbnailHeight));  
                    else  
                        GUILayout.Box("N/A", GUILayout.Width(ThumbnailWidth), GUILayout.Height(ThumbnailHeight));  
  
                    GUILayout.Label("Shader:" + mat.shader.name, GUILayout.Width(140)); //Shader名称  
  
                    //特效主颜色显示  
                    if (mat.HasProperty("_Color"))  
                        EditorGUILayout.ColorField(mat.color, GUILayout.Width(50));  
                    else if (mat.HasProperty("_TintColor"))  
                        EditorGUILayout.ColorField(mat.GetColor("_TintColor"), GUILayout.Width(50));  
                    else  
                        GUILayout.Box("N/A", GUILayout.Width(50));  
                }  
  
                //发射粒子数判断  
                float emission = effectParticle.maxEmission;  
                if (emission < 50)  
                    GUILayout.Label("MaxEmission:" + emission.ToString(), GUILayout.Width(120));  
                else  
    {GUILayout.Label("MaxEmission:" + emission.ToString(), style);
     //字体标红  
     //effectParticle.prefab.GetComponent<ParticleSystemRenderer>().particleSystem.maxParticles =50; //将大于50的修改为50(慎用,会导致粒子效果改变)
      

    }
  
                //特效名称,并可定位到相应文件  
                if (GUILayout.Button(effectParticle.name))  
                    Selection.activeObject = effectParticle.prefab;  
  
                //文件所在路径节点  
             //   GUILayout.TextField("Node:" + effectParticle.prefab.hierarcyPath);  
  
                GUILayout.EndHorizontal();  
           }  
        }  
        EditorGUILayout.EndScrollView();  
    }  
  
    //特效信息实体类  
    class EffectParticle  
   {  
        public string name;  
        public Material material;  
        public float maxEmission;  
        public GameObject prefab;  
        public bool bScaleWithTransform;  
        public EffectParticle()  
        {  
            maxEmission = 0;  
          
    }  
}  
}

Unity3D粒子特效

阅读数 888

Unity新版粒子特效

博文 来自: qq563129582
没有更多推荐了,返回首页