粒子系统 ParticleSystem

目前正跟随官网 Junior Programmer 课程学习。

前一段时间学习到的一些内容,将分别纪要。

1.粒子系统

Junior Programmer 课程的第 3.4 章节左右,首次接触 Unity 的粒子系统。

我们实际上做的事情比较简单:

  • 声明一个 ParticleSystem 类的变量
  • 将一个粒子资源文件添加至 Scene 中,拖放其位置、调整旋转角度至恰当;
  • Inspector 中拖放该粒子资源至相应变量处
  • 在需要播放粒子特效时,使用 Play() 方法播放粒子特效
  • 在需要停止粒子特效时,使用 Stop() 方法停用粒子特效

脚本调用示意如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
[SerializeField] private ParticleSystem explosionPart;
[SerializeField] private ParticleSystem dirtPart;

void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && onGround && !isGameOver)
{
onGround = false;
//施加向上的力
rig.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
//切换动画
playerAnim.SetTrigger("Jump_trig");
//停止播放粒子动画
dirtPart.Stop();
//播放声音
playerAudio.PlayOneShot(jumpSound, 1.0f);
}
}

private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("ground"))
{
onGround = true;
//播放粒子特效
dirtPart.Play();
}
else if (collision.gameObject.CompareTag("obstacle"))
{
isGameOver = true;
//切换死亡动画
playerAnim.SetBool("Death_b", true);
playerAnim.SetInteger("DeathType_int", 1);
//播放爆炸粒子动画
explosionPart.Play();
//停止播放粒子动画
dirtPart.Stop();
//Debug.Log("Game Over !!!");
//播放声音
playerAudio.PlayOneShot(crushSound, 1.0f);
}

}
}

以上。

2.深入了解

在 Unity Document 中对 ParticleSystem 的描述是:

ParticleSystem 的脚本接口。功能强大、用途广泛的 Unity 粒子系统实现。

常规参数

粒子系统的常规参数保存在一个特殊的主模块中。在 Inspector 中,这些参数显示在所有其他模块上方:

image-20210814142903608

在脚本中,可以通过 ParticleSystem.main 访问这些参数。

模块效果乘数

每个模块都有一些特殊的乘数属性,利用这些属性,您可以在不编辑曲线本身的情况下更改曲线的整体效果。这些乘数属性全部以它们影响的曲线命名 - 例如,ParticleSystem.emission.rateMultiplier 控制 ParticleSystem.emission.rate 在给定系统中的整体效果。

常量值的简写表示法

对于简单的常量值,参数支持简写表示法。要为参数设置常量值,只需为其指定一个数字。无需在 ParticleSystemCurveMode.Constant 模式下创建 MinMaxCurveMinMaxGradient 对象。

例如,下面的语句:

1
ParticleSystem.emission.rate = new ParticleSystem.MinMaxCurve(5.0f);

应写成:

1
ParticleSystem.emission.rate = 5.0f;

性能注意事项:在粒子模块上设置属性时,设置会立即传递到本机代码。这样可以提供最佳的性能。也就是说,在模块结构上设置属性时,不会在脚本中设置需要重新设置回粒子系统的内容;一切都是自动完成的。

另请参阅:Particle

2.1 常用变量

如下:

变量 说明
isEmitting 确定粒子系统是否发射粒子。当粒子系统的发射模块已完成、已暂停或已使用 Stop 和 StopEmitting 标志来停止该系统时,粒子系统可能停止发射。可以调用 Play 来恢复发射。
isPaused 确定粒子系统是否已暂停。
isPlaying 确定粒子系统是否在播放。
isStopped 确定粒子系统是否已停止。
particleCount 当前粒子数(只读)。
time 播放位置(以秒为单位)。

有大量删减。

2.2 公共函数

常用的公共函数如下:

公共函数 说明
Clear 删除粒子系统中的所有粒子。
Emit 立即发射 count 个粒子。
IsAlive 粒子系统是否包含任何存活的粒子,还是会产生更多粒子?
Pause 暂停系统,因此不再发射新粒子,也不再更新现有粒子。
Play 启动粒子系统。
Stop 使用提供的停止行为,停止播放粒子系统。

有大量删减。

继承成员暂不涉及。

在 Unity Document 中对 AudioSource 的描述要复杂的多,详细了解可参考以下路径:

以上。