添加粒子系统
按照GameObject -> Effect -> Particle System顺序,添加粒子系统,效果如下:
粒子系统有其独特的组件:Particle System
展开上面的一系列属性中的Particle System,调整duration子属性,见下图。
- 这个是表示生成粒子的持续时间,注意需要把下面的子属性looping关掉,这个属性表示在执行完一个duration之后是否继续执行下一个duration。
将duration设置为1和5的效果区别如下:
duration=1
duration=5
-
调整prewarm子属性,这个是预热的意思,只能在勾选looping属性后勾选。勾选之前粒子是产生就发射了,会看到粒子从产生到扩散的全过程;而勾选该属性之后感觉看到的就是粒子已经产生并且扩散了一段时间的结果。
-
start delay是设置粒子最开始经过多久才开始生成,这个属性需要在没有勾选prewarm的情况下才能够勾选。
-
start lifetime是粒子产生之后存在的时间。
现在将粒子设置为start delay=1,start lifetime=1效果如下
和最开始的初始没有勾选start delay,并且start lifetime=5形成鲜明对比。
-
Start Speed指粒子的开始速度
-
Start Size指粒子开始的大小
-
Start Rotation指粒子开始的旋转方向
-
Start Color指粒子开始的颜色值
将颜色改为绿色,效果如下
还可以选择随着时间动态变化,选择gradient,然后进入调色
效果如下,可以看到,在一个周期内,最开始的粒子颜色是黑色,后来变成黄色了,下一个周期又从黑色到黄色动态变化
-
3D Start Size 字面意思就是3维的Start Size,3D Start Rotation是3维的Start Rotation(原来是2维的)
下面将粒子x方向的大小设置为0.5,y方向角度设为45度,效果如下:
-
Max Particles是指粒子系统一个周期内能产生的所有粒子总数,如果一个周期已经产生的粒子达到这个数目,将不会再有粒子产生,例如将这个值设为5,效果如下
-
gravity modifier用来调整粒子系统的重力效果
将该属性设置为10,之后的效果为
-
color over time ,指的是粒子颜色随时间的变化,与刚才start color的梯度设置不同的是,这个是同一个粒子随着时间会发生改变,而刚才的是随着时间变化不同粒子的初始颜色不同。效果如下,可以发现粒子一开始是蓝色,逐渐边黄,再变红,再变白,与刚才设置的start color的梯度变换还是十分不同的
- Simulation Space是粒子的参考系,如果选择local,则移动整个粒子系统坐标时,所有的粒子也会跟着移动,如果选择的是world,则粒子不会随粒子系统移动。
- Rate是指发射粒子的速率
- Bursts是指来在某时刻集中发射一定数量的粒子。
- shape是指粒子发射的整体形状,比如默认选择的cone,就是沿着圆锥散开的,如果选择sphere,粒子就会沿着四面八方散开(因为是球形扩散面),选择semi-sphere就会沿着半圆散开。
- Texture Sheet Animation和下方的Renderer一起使用可以改变粒子的形状。
首先Renderer中换材质球为自己下载的材质球:
然后再将Texture Sheet Animation中的Tiles中的X和Y都设为2,这一步是用作贴图的切分,X代表图像在横向上被切分的块数,Y代表在纵向上被切分的块数。
接着看Animation,选择Whole Sheet。这里whole sheet表示使用贴图的各部分帧动画播放,Single Row则表示选取其中一行。
最后再将Frame over Time表示动画的帧随着时间的变化,这里我们选择Curve并将其设置为线性就可以利用刚才切分的贴图的四部分进行循环播放了。
效果如下,粒子的光晕从小到大,然而这是实际是由贴图决定的
再对其按照自己喜好设置一些属性,附加上下面这段控制粒子系统坐标系的代码,一个粒子系统就做好了
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class tes : MonoBehaviour
{
ParticleSystem ps;
int direction;
void Start()
{
ps = GetComponent<ParticleSystem>();
direction = 0;
}
void Update()
{
int minX = -10, maxX = 10;
if (direction == 0 && ps.transform.position.x > minX)
{
ps.transform.position += Vector3.left * Time.deltaTime * 30;
ps.transform.position += Vector3.up * Time.deltaTime * 15;
}
else if (direction == 1 && ps.transform.position.x < maxX)
{
ps.transform.position += Vector3.right * Time.deltaTime * 30;
ps.transform.position += Vector3.down * Time.deltaTime * 15;
}
else direction = 1 - direction;
}
}
最终效果如下:
资源