Unity粒子系统学习记录7-Collision和Triggers模块

Collision 模块

控制粒子如何与场景中的GameObject发生碰撞

两个模式:Plane和World

Plane模式

属性 作用
Planes 用于定义碰撞平面的变换的可扩展列表。
Visualization 选择要将 Scene 视图中的碰撞平面辅助图标显示为线框网格还是实体平面。
Scale Plane 用于可视化的平面大小。
Dampen 粒子碰撞后损失的速度比例。
Bounce 粒子碰撞后从表面反弹的速度比例。
Lifetime Loss 粒子碰撞后损失的总生命周期比例。
Min Kill Speed 碰撞后运动速度低于此速度的粒子将从系统中予以移除。
Max Kill Speed 碰撞后运动速度高于此速度的粒子将从系统中予以移除。
Radius Scale 允许调整粒子碰撞球体的半径,使其更贴近粒子图形的可视边缘。
Send Collision Messages 如果启用此属性,则可从脚本中通过OnParticleCollision函数检测粒子碰撞。
Visualize Bounds 在 Scene 视图中将每个粒子的碰撞边界渲染为线框形状。

启用 Planes 模式后,可通过 Planes 属性添加一组transform(通常为空游戏对象)。平面在对象的局部 XZ 平面中无限延伸,其中以正 Y 轴表示平面的法线矢量。为了协助开发,无论对象本身是否具有任何可见的网格,平面都将在场景中显示为辅助图标。辅助图标可显示为线框网格或实体平面,也可进行缩放。但是,缩放仅适用于可视化;碰撞平面本身在场景中无限延伸。

World模式

属性 作用
Dampen 粒子碰撞后损失的速度比例。
Bounce 粒子碰撞后从表面反弹的速度比例。
Lifetime Loss 粒子碰撞后损失的总生命周期比例。
Min Kill Speed 碰撞后运动速度低于此速度的粒子将从系统中予以移除。
Max Kill Speed 碰撞后运动速度高于此速度的粒子将从系统中予以移除。
Radius Scale 2D 或 3D 的设置。
Collision Quality 使用下拉选单来设置粒子碰撞的质量。此设置会影响有多少粒子可以穿过碰撞体。在较低的质量水平下,粒子有时会穿过碰撞体,但需要的计算资源较少。
High 当 Collision Quality 设置为 High 时,碰撞始终使用物理系统来检测碰撞结果。此设置是最耗费资源但也是最准确的选项。
Medium (Static Colliders) 当 Collision Quality 设置为 Medium (Static Colliders) 时,碰撞使用一组体素来缓存先前的碰撞,从而在以后的帧中更快地重用。Medium 和 Low 之间的唯一区别是粒子系统在每帧查询物理系统的次数。Medium 每帧的查询次数多于 Low。 请注意,此设置仅适用于从不移动的静态碰撞体。
Low (Static Colliders) 当 Collision Quality 设置为 Low (Static Colliders) 时,碰撞使用一组体素来缓存先前的碰撞,从而在以后的帧中更快地重用。请注意,此设置仅适用于从不移动的静态碰撞体。
Collides With 粒子只会与所选层上的对象发生碰撞。
Max Collision Shapes 粒子碰撞可包括的碰撞形状个数。多余的形状将被忽略,且地形优先。
Enable Dynamic Colliders 粒子是否响应与除Kinematic刚体以外的碰撞体的碰撞,否则粒子只响应与static碰撞体的碰撞
Voxel Size 体素 (voxel) 表示三维空间中的常规网格上的值。使用 Medium 或 Low 质量碰撞时,Unity 会在网格结构中缓存碰撞。此设置控制着网格大小。较小的值可提供更高的准确性,但会占用更多内存,效率也会降低。 注意:仅当 Collision Quality 设置为 Medium 或 Low 时,才能访问此属性。
Collider Force 在粒子碰撞后对物理碰撞体施力。这对于用粒子推动碰撞体很有用。
Multiply by Collision Angle 向碰撞体施力时,根据粒子与碰撞体之间的碰撞角度来缩放力的强度。掠射角将比正面碰撞产生更小的力。
Multiply by Particle Speed 向碰撞体施力时,根据粒子的速度来缩放力的强度。快速移动的粒子会比较慢的粒子产生更大的力。
Multiply by Particle Size 向碰撞体施力时,根据粒子的大小来缩放力的强度。较大的粒子会比较小的粒子产生更大的力。
Send Collision Messages 如果选中此复选框,则允许从脚本中通过OnParticleCollision函数检测粒子碰撞。
Visualize Bounds 在 Scene 视图中预览每个粒子的碰撞球体。

Triggers 模块

控制粒子与场景中碰撞体的触发

添加碰撞体到列表

首先,指定粒子可与场景中的哪些碰撞体进行碰撞。

在 OnParticleTrigger() 中访问粒子

如果选择 Callback 作为对某一触发事件的反应,则可以从附加的脚本访问满足事件条件的粒子。为此,首先需要将 OnParticleTrigger() 函数添加到附加的脚本。在此函数中,调用ParticlePhysicsExtensions.GetTriggerParticles() 函数可获取满足触发事件条件的粒子列表。此函数接受ParticleSystemTriggerEventType(用于指定需要获取粒子的触发事件,即 Inside、Outside、Enter 还是 Exit)以及一个粒子列表(函数将向其中填充结果)。从这一列表中,可以访问、修改或销毁任何粒子。

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
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

[ExecuteInEditMode]
public class TriggerScript : MonoBehaviour
{
ParticleSystem ps;

// 这些列表用于包含与每帧的触发条件
// 匹配的粒子。
List<ParticleSystem.Particle> enter = new List<ParticleSystem.Particle>();
List<ParticleSystem.Particle> exit = new List<ParticleSystem.Particle>();

void OnEnable()
{
ps = GetComponent<ParticleSystem>();
}

void OnParticleTrigger()
{
// 获取与此帧的触发条件匹配的粒子
int numEnter = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Enter, enter);
int numExit = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit);

// iterate through the particles which entered the trigger and make them red
for (int i = 0; i < numEnter; i++)
{
ParticleSystem.Particle p = enter[i];
p.startColor = new Color32(255, 0, 0, 255);
enter[i] = p;
}

// 迭代离开触发器的粒子并使它们变绿
for (int i = 0; i < numExit; i++)
{
ParticleSystem.Particle p = exit[i];
p.startColor = new Color32(0, 255, 0, 255);
exit[i] = p;
}

// 将修改后的粒子重新分配回粒子系统
ps.SetTriggerParticles(ParticleSystemTriggerEventType.Enter, enter);
ps.SetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit);
}
}

属性

属性 作用
inside 指定粒子系统在粒子位于碰撞体内的每一帧对粒子采取的操作。选项包括: • Callback:将粒子添加到可在 OnParticleTrigger() 回调中获取的列表中 • Kill:销毁粒子。 • Ignore:忽略粒子。
Outside 指定粒子系统在粒子位于碰撞体外的每一帧对粒子采取的操作。选项包括: • Callback:将粒子添加到可在 OnParticleTrigger() 回调中获取的列表中 • Kill:销毁粒子。 • Ignore:忽略粒子。
Enter 指定粒子系统在粒子进入碰撞体的帧对粒子采取的操作。选项包括: • Callback:将粒子添加到可在 OnParticleTrigger() 回调中获取的列表中 • Kill:销毁粒子。 • Ignore:忽略粒子。
Exit 指定粒子系统在粒子退出碰撞体的帧对粒子采取的操作。选项包括: • Callback:将粒子添加到可在 OnParticleTrigger() 回调中获取的列表中 • Kill:销毁粒子。 • Ignore:忽略粒子。
Collider Query Mode 指定此粒子系统用于获取有关与粒子交互的碰撞体的信息的方法。这增加了处理触发器模块所需的资源,因此,如果不需要任何额外的碰撞信息,请将此属性设置为 Disabled。选项是: • Disabled:没有获取关于每个粒子与哪个碰撞体交互的任何信息。 • One:获取有关每个粒子交互的第一个碰撞体的信息。如果粒子与帧中的多个碰撞体交互,则返回 Collider 列表中与粒子交互的第一个碰撞体。 • All:获取有关每个粒子交互的每个碰撞体的信息。
Radius Scale 粒子的碰撞体边界。允许您更紧密地将粒子的碰撞体边界匹配到粒子的视觉外观。如果粒子为圆形且其纹理具有淡入淡出效果,这将很有用,因为默认粒子碰撞体将在粒子达到视觉效果之前位于触发器内。请注意,当事件实际触发时,此设置不会更改,但是可以延迟或提前达到触发器的视觉效果。 • 输入 1 可以使粒子碰撞体保持同一大小,并使事件在粒子接触碰撞体时发生 • 输入小于 1 的值可以使粒子碰撞体更小,并使触发看起来是在粒子穿透碰撞体之前发生 • 输入大于 1 的值可以使粒子碰撞体更大,并使触发看起来是在粒子穿透碰撞体之后发生
Visualize Bounds 指示是否在 Scene 视图中显示每个粒子的碰撞体边界。启用此属性可显示碰撞体边界,而禁用则可隐藏碰撞体边界。