本篇来讲一讲Collision和Triggers模块,这两个模块主要用于粒子系统与物理世界的交互,一个是碰撞器,另一个是触发器。有了这两个模块我们又可以做出更炫酷的粒子效果啦!
- 前言
- 本系列提要
- 一、Collision
- 1.Planes
- 2.World
- Collision Quality测试
- Collider Force测试
- 二、Triggers
- 1.Colliders
- 2.触发事件
- 3.API调用案例
- 4.其他参数
- 三、总结和参考资料
- 1.总结
- 2.参考资料
Unity粒子系统专题博客共分成十二篇来讲解: 【本篇为第五篇】
- 第一篇(点击直达):粒子系统概述
- 第二篇(点击直达):主模块
- 第三篇(点击直达):Emission、Shape模块
- 第四篇(点击直达):Renderer、Custom Data模块
- 第五篇(点击直达):Noise模块
- 第六篇(点击直达):生命周期相关模块
- 第七篇(点击直达):Collision、Triggers模块
- 第八篇(点击直达):Inherit Velocity、Sub Emitters模块
- 第九篇(点击直达):Texture Sheet Animation模块
- 第十篇(点击直达):Light、Trails模块
- 第十一篇(点击直达):粒子系统力场(Force Field)组件和External Forces模块
- 第十二篇(点击直达):案例与应用
前排提醒:本文仅代表个人观点,以供交流学习,若有不同意见请评论留言,笔者一定好好学习,天天向上。
Unity版本[2019.4.10f1] 梦小天幼 & 禁止转载
视频讲解: 【详解Unity】粒子系统(七) | Particle System | Collision、Triggers模块讲解
一、Collision控制粒子如何与场景中的游戏对象发生碰撞
该模块分为两种模式,分别是Planes和World,通过这两种模式可以设置粒子是与平面碰撞还是与世界中的所有物体碰撞。
1.Planes题外话: Planes肯定要比World模式节省计算量,但Planes仅能对平面产生一个碰撞,适用于简易房间,地板等场景(注意,Planes是可叠加的,并不是只能设置一块,Planes选项下有一个“加号”按钮)
2.World图中白色方块是一个刚体碰撞体,地面是一个静态碰撞体,当为High时,粒子响应一切碰撞,当设置为Medium时,粒子忽略刚体碰撞体,仅响应静态碰撞体。
Collider Force参数设置为1000,十二个方块都是刚体碰撞体。所以粒子可以对场景世界中的刚体产生推动力。
控制粒子与场景中碰撞体的触发
需要指定Colliders列表的参数,该属性用于确定粒子将与哪些碰撞体发生触发事件;可通过加号或者减号来增删碰撞体列表。
上图表示,粒子系统将与测试碰撞体和测试碰撞体(1)发生触发事件
2.触发事件触发事件有四种,Inside\Outside\Enter\Exit
Inside:粒子在碰撞体的边界内 Outside:粒子在碰撞体的边界外 Enter:粒子进入碰撞体的边界 Exit:粒子退出碰撞体的边界
每种触发事件都有对应的选项,来指定该事件如何被触发:
Callback:允许您在 OnParticleTrigger() 回调函数中访问粒子 Kill:销毁粒子;无法使用回调 Ignore:忽略粒子;无法使用回调
3.API调用案例当你设置触发事件的方式为Callback时,就代表系统会自动调用回调函数。
你可以使用 ParticlePhysics.GetTriggerParticles(触发事件类型,返回粒子列表List) 函数来获取触发事件的粒子列表
下图,当粒子穿越预先设置的碰撞器,会触发事件,通过代码获取触发Enter和Exit事件的粒子list,然后循环迭代改变其颜色。
public class Test : MonoBehaviour
{
ParticleSystem ps;
List enter = new List();
List exit = new List();
void Start()
{
//获取粒子系统组件
ps = GetComponent();
}
void OnParticleTrigger()
{
//获取触发响应事件的粒子列表,并返回给预先定义的List
int numEnter = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Enter, enter);
int numExit = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit);
//将进入触发区的粒子变个颜色
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);
}
}
4.其他参数
Radius Scale 调整粒子碰撞体边界,默认为1。 Visualize Bounds 在 Scene 视图中将每个粒子的碰撞边界渲染为线框形状
三、总结和参考资料 1.总结无总结
2.参考资料[1].Unity官方.官方手册-粒子系统-Collision [2].Unity官方.官方手册-粒子系统-Triggers [3].梦小天幼.详解Unity中的刚体和碰撞体组件