unity 粒子特效

2015年01月31日 13:49 0 点赞 0 评论 更新于 2025-11-21 15:43

今天我们来详细了解一下 Unity 中非常重要的一部分——Unity 粒子特效。

粒子特效原理

粒子特效的原理是将若干粒子进行无规则组合,以此来模拟火焰、爆炸、水滴、雾气等效果。若要使用粒子特效,首先需要进行创建。在 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.GetComponent<ParticleEmitter>().maxSize = GUILayout.HorizontalSlider (particle.GetComponent<ParticleEmitter>().maxSize, 0.0f, 10.0f, GUILayout.Width(150));

// 拖动设置粒子的最大消失时间
GUILayout.Label("粒子消失时间");
particle.GetComponent<ParticleEmitter>().maxEnergy = GUILayout.HorizontalSlider (particle.GetComponent<ParticleEmitter>().maxEnergy, 0.0f, 10.0f, GUILayout.Width(150));

// 拖动设置粒子的最大生成数量
GUILayout.Label("粒子的最大生成数量");
particle.GetComponent<ParticleEmitter>().maxEmission = GUILayout.HorizontalSlider (particle.GetComponent<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.GetComponent<ParticleEmitter>().worldVelocity = new Vector3(velocity_x, particle.GetComponent<ParticleEmitter>().worldVelocity.y, particle.GetComponent<ParticleEmitter>().worldVelocity.z);

// 拖动设置粒子 Y 轴的移动速度
GUILayout.Label("粒子 y 轴的移动速度");
velocity_y = GUILayout.HorizontalSlider (velocity_y, 0.0f, 10.0f, GUILayout.Width(150));
particle.GetComponent<ParticleEmitter>().worldVelocity = new Vector3(particle.GetComponent<ParticleEmitter>().worldVelocity.x, velocity_y, particle.GetComponent<ParticleEmitter>().worldVelocity.z);

// 拖动设置粒子 Z 轴的移动速度
GUILayout.Label("粒子 z 轴的移动速度");
velocity_z = GUILayout.HorizontalSlider (velocity_z, 0.0f, 10.0f, GUILayout.Width(150));
particle.GetComponent<ParticleEmitter>().worldVelocity = new Vector3(particle.GetComponent<ParticleEmitter>().worldVelocity.x, particle.GetComponent<ParticleEmitter>().worldVelocity.y, velocity_z);
}
}

运行说明

将上述脚本挂载到场景中的某个对象上,然后运行游戏,即可通过 GUI 滑块来控制粒子的各项属性。

作者信息

feifeila

feifeila

共发布了 3994 篇文章