详解Unity中的粒子系统Particle System (七)
前言
本篇来讲一讲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
参数 | 作用 |
---|---|
Type | 碰撞模块的两种模式,Planes、World |
Planes | 通过获取游戏对象的Transform来沿着XZ轴生成一个无限大的平面,Y轴为其平面法向 |
Visualization | 控制平面的可视化是网格还是平面 |
Scale Plane | 控制平面的可视化的大小,注意:实际碰撞平面是无限大的,该选项仅供开发者在Scene窗口参考使用 |
--------- | -------------- |
Dampen | 粒子碰撞后损失的速度比例 |
Bounce | 粒子碰撞后从表面反弹的速度比例 |
Lifetime Loss | 粒子碰撞后损失的总生命周期比例 |
Min Kill Speed | 碰撞后运动速度低于此速度的粒子将从系统中予以移除 |
Max Kill Speed | 碰撞后运动速度高于此速度的粒子将从系统中予以移除 |
--------- | -------------- |
Radius Scale | 允许调整粒子碰撞球体的半径,使其更贴近粒子图形的可视边缘 |
Send Collision Messages | 如果启用此属性,则可从脚本中通过 OnParticleCollision 函数检测粒子碰撞 |
Visualize Bounds | 在 Scene 视图中将每个粒子的碰撞边界渲染为线框形状 |
题外话: Planes肯定要比World模式节省计算量,但Planes仅能对平面产生一个碰撞,适用于简易房间,地板等场景(注意,Planes是可叠加的,并不是只能设置一块,Planes选项下有一个“加号”按钮)
2.World
参数 | 作用 |
---|---|
Type | 碰撞模块的两种模式,Planes、World |
Mode | 碰撞模式,3D或者2D(只讲3D的情况) |
--------- | -------------- |
Dampen | 粒子碰撞后损失的速度比例 |
Bounce | 粒子碰撞后从表面反弹的速度比例 |
Lifetime Loss | 粒子碰撞后损失的总生命周期比例 |
Min Kill Speed | 碰撞后运动速度低于此速度的粒子将从系统中予以移除 |
Max Kill Speed | 碰撞后运动速度高于此速度的粒子将从系统中予以移除 |
Radius Scale | 允许调整粒子碰撞球体的半径,使其更贴近粒子图形的可视边缘 |
--------- | -------------- |
Collision Quality | 碰撞质量 |
Collision Quality - High | 碰撞始终使用物理系统来检测碰撞结果。此设置是最耗费资源但也是最准确的选项 |
Collision Quality - Medium | 对先前碰撞进行缓存,之后如果有重复则调用此部分缓存,没有再查询物理系统,此设置仅适用于从不移动的静态碰撞体 |
Collision Quality - Low | 对先前碰撞进行缓存,之后如果有重复则调用此部分缓存,没有再查询物理系统,比Medium查询物理系统次数更低,此设置仅适用于从不移动的静态碰撞体 |
Collides With | 选择粒子与之碰撞的层 |
Max Collision Shapes | 粒子碰撞可包括的碰撞形状(Mesh)的个数,且地形优先;默认为256,也就是说粒子可与256个不同的Mesh碰撞,再多一个就不生效了 |
Enable Dynamic Collider | 粒子是否响应与刚体碰撞体的碰撞 |
--------- | -------------- |
Collider Force | 粒子碰撞后,对刚体碰撞体施加作用力 |
Multiply By Collision Angle | 向碰撞体施力时,根据粒子与碰撞体之间的碰撞角度来缩放力的强度。掠射角将比正面碰撞产生更小的力 |
Multiply By Particle Speed | 向碰撞体施力时,根据粒子的速度来缩放力的强度。快速移动的粒子会比较慢的粒子产生更大的力 |
Multiply By Particle Size | 向碰撞体施力时,根据粒子的大小来缩放力的强度。较大的粒子会比较小的粒子产生更大的力 |
--------- | -------------- |
Send Collision Messages | 如果启用此属性,则可从脚本中通过 OnParticleCollision 函数检测粒子碰撞 |
Visualize Bounds | 在 Scene 视图中将每个粒子的碰撞边界渲染为线框形状 |
Collision Quality测试
图中白色方块是一个刚体碰撞体,地面是一个静态碰撞体,当为High时,粒子响应一切碰撞,当设置为Medium时,粒子忽略刚体碰撞体,仅响应静态碰撞体。
Collider Force测试
Collider Force参数设置为1000,十二个方块都是刚体碰撞体。所以粒子可以对场景世界中的刚体产生推动力。
二、Triggers
控制粒子与场景中碰撞体的触发
1.Colliders
需要指定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<ParticleSystem.Particle> enter = new List<ParticleSystem.Particle>();List<ParticleSystem.Particle> exit = new List<ParticleSystem.Particle>();void Start(){//获取粒子系统组件ps = GetComponent<ParticleSystem>();}void OnParticleTrigger(){//获取触发响应事件的粒子列表,并返回给预先定义的Listint 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中的刚体和碰撞体组件
详解Unity中的粒子系统Particle System (七)相关推荐
- 详解Unity中的粒子系统Particle System (二)
前言 上一篇我们简要讲述了粒子系统是什么,如何添加,以及基本模块的介绍,以及对于曲线和颜色编辑器的讲解.从本篇开始,我们将按照模块结构讲解下去,本篇主要讲粒子系统的主模块,该模块主要是控制粒子的初始状 ...
- 详解Unity中的粒子系统Particle System (三)
前言 上一篇我们详细讲解了有关主模块的全部内容,已经对粒子系统的基本运作有了足够的了解,本篇就来讲一下被粒子系统默认启用的Emission.Shape.Renderer模块又在粒子系统中扮演着怎么样的 ...
- 详解Unity中的粒子系统Particle System (一)
前言 游戏中很多炫酷效果的背后都离不开粒子系统,比如击中.爆炸.火焰.崩塌.喷射.烟雾等等.Unity也我们提供了强大的粒子系统,模块化的设计,上百个参数供我们调节使用,足以创造出非常震撼的效果了,本 ...
- 详解Unity中的粒子系统Particle System (九)
前言 今天讲Texture Sheet Animation模块,先前我们已经讲了很多很多模块,通过上述模块可以实现很酷的效果,但是缺了一点真实感.比如说爆炸特效,仅指望单独的粒子来模拟真实的爆炸效果是 ...
- 详解Unity中的粒子系统Particle System (四)
前言 上一篇我们主要讲解了Shape形状模块,以及Emission发射模块,这是粒子系统中最为重要的两个模块,学会了它们我们足以做出惊艳的效果,比如霰弹枪的发射,蘑菇蛋的冲击波等等.本篇讲的内容依旧重 ...
- 详解Unity中的粒子系统Particle System (十一)
前言 今天讲最后一个模块--External Forces,该模块需要和Force Field组件配合使用,作用是模拟物理的力对粒子的影响.至此,Unity内置粒子系统的最后一块物理砖补齐,理论上来讲 ...
- 详解Unity中的粒子系统Particle System (八)
前言 书接上回,咱们继续讲粒子系统,本篇该说Inherit Velocity和Sub Emitters这两个模块,依旧是重量级选手,特别是Sub Emitters这个模块,有了它,我们的粒子效果可以做 ...
- 详解Unity中的粒子系统Particle System (六)
前言 今天写粒子系统的第六篇文章,讲到这,一些主要模块其实已经讲完了,剩下的就是一些无关紧要或者更加高级的模块了,比如涉及到物理碰撞模块的,涉及到光照系统模块的等等.今天先把剩余无关紧要的模块给讲了, ...
- 详解Unity中的粒子系统Particle System (五)
前言 通过前几篇的学习,我们已经知道了粒子系统的几大基础模块的设置,有了这些模块的知识,我们足以做出惊艳的效果了.今天我们再学一个新的模块,叫做Noise模块,中文译为噪波.噪声.湍流模块等.这个模块 ...
最新文章
- linux useradd
- html页面调用ico图标,如何在HTML中使用图标字体 - icon font?
- Application provided invalid, non monotonically increasing dts to muxer in stream 0: -92233720368547
- python菜谱发送到邮箱_Python菜谱5:发送带附件的邮件
- python中怎么精确20位_Python中的精确处理
- [Git高级教程(二)] 远程仓库版本回退方法
- unix grep命令_Linux / UNIX中的Grep命令
- CentOS下编译安装LAMP开发环境
- Laravel 5.3 windows环境安装
- iapp导入源码使用教程,iapp保存图像代码教程
- php主动防御,汽车主动防御系统
- WPF实现DoEvents
- linux禁用137 138端口,如何关闭135、137、138、139、445端口方法
- ubuntu18.04环境下为UR3配置MoveIt!运动学插件IKFAST(一)
- sklearn之make_blobs:产生数据集
- 杭电oj 2081 手机短号(C++)
- Android带数字拼音与带音标拼音互转工具类
- c#操作word文档(转自小排_流浪狗)
- matlab 微分符号,Matlab 符号微积分
- 有没有被坦克大战支配过?
热门文章
- 面试 | HR面可能遇到的问题
- Win8下安装配置Docker ToolBox并制作镜像配置Handoop集群
- 对字符串按“红黄蓝”进行排序,如“蓝黄红红黄”,输出结果为“红红黄黄蓝”
- python计算一个三位数个位数之和
- 区块链知识点杂记(并不全面)
- 计算机的cup颗数、核数、线程数
- matlab实现拉依达准则,拉依达准则matalb程序
- python中批量将矩形图片转化为正方形图片,并且缩放
- 【企业高管】CIO vs CEO:主要区别是什么?
- 舌尖上的职场(三)我来买单!(转)