关于Unity粒子系统碰撞的几个坑

unity3d粒子碰撞检测,判断例子碰撞到物体 手动在Scene 面板拖动特效或者物体,使他们相碰撞,即可触发OnParticleCollision 函数)2.把特效的Particle System 中的Collision组件里的。1.首先 物体必须有Collder。数组来处理多个粒子对象碰撞事件事件。... 阅读详情

关于Unity粒子系统碰撞的几个坑

最近公司的项目正好要用到粒子系统的碰撞,所以特意研究了一下。在实践中遇到了很多问题,所以借此文记录一下学习的过程。而且学习过程中发现网上这方面文章极少,所以也算借这篇文章填补一下行业漏洞,顺道给自己和后来者一个参考。本人接触Unity时间也不算太长,如果下面哪里说的不对,欢迎各位大神纠正。
大量图片预警

粒子与碰撞器的碰撞

这一部分官方用户手册有很明确的说明,首先找到手册下图这一层级目录 Collision Module,点进去就能看到关于面板所有参数的介绍了:
官方用户手册粒子碰撞目录
这里我用的是Unity5.6.4的用户手册,是本地文件,所以就不贴链接了,而且我相信愿意看这篇文章的人,应该不至于找不到用户手册吧……
这篇手册已经讲得详细了,所以我们只讨论一些文章里没有提到的东西和提到了但是说得比较模糊的东西。点进去之后拉到文章最后你会看到这样一段关于粒子碰撞的介绍:
用户手册中关于碰撞回调的介绍
简单的说就是告诉你怎么用碰撞检测脚本,但是请注意它说的是 the object with the particle system, or the one with the Collider, or both 也就是说只有带有粒子系统或者带有碰撞器的物体之间可以碰撞,而且经过我的实践发现:只有一个带有碰撞器组件的物体和一个带有粒子系统并开启了粒子碰撞的物体之间碰撞才会触发碰撞事件,其他任何情况都无法触发粒子碰撞事件,如果您不信可以继续看下去。
我们先来看一下简单的一种情况,也就是官方提供的这种情况,同时也是网上在我写这篇文章之前能搜到的最多的一种情况。所以我尽量用最短的篇幅介绍,如果您除了这种情况不会用到其他情况,那看完这一小节后下面的就不用看了。
我们打开Unity直接实践:
新建一个场景,创建一个平面当地面,删掉原有摄像机(我们会用FPS控制器,自带相机),拖上来一个粒子(这里你随意拖一个粒子就好,我用的是一个火焰粒子),开启粒子碰撞,我的设置如下,其中 Radius Scale 和 Colliders With 要根据你的实际粒子来设置,前者为碰撞器大小,后者为需要碰撞的层。
在这里插入图片描述
然后我为了节省时间是把标准资源中的FPS控制器拖进来了,如果你有时间可以自己写一个FPS控制器……然后将控制器的标签和层都改成 “Player” ,如果没有可以自己添加,只要记得添加好后把 Colliders With 也相应改好就行。现在你选中粒子应该可以在Scene视图下看到粒子碰撞器了:
在这里插入图片描述
然后开始写脚本吧,我就用最简单的代码测试一下,代码如下,脚本拖到粒子身上:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FireTest : MonoBehaviour
{
    private void OnParticleCollision(GameObject other)
    {
        if (other.tag == "Player")
        {
            Debug.Log("一个玩家已死亡");
        }
    }
}

接下来运行游戏即可,走到火焰上就会看到打印,说明碰撞检测生效。你应该会注意到不但打印了而且打印了很多次,这说明每一个粒子的碰撞都会单独触发。
在这里插入图片描述
截至到此,如果您不需要用到其他的碰撞(只是粒子和带碰撞器组件的物体之间的碰撞),您可以不用往下看了。

粒子与射线的碰撞

接下来我们看一下射线与粒子的碰撞。这是我在做项目的时候,项目需要做一个准星检测前方区域是否有粒子然后变色的功能,自然得就想到要用射线检测。还用刚才的场景,为了加强说服力,我把 Colliders With 改成“Everything”,也就是可以和一切有碰撞的物体碰撞,然后写发射射线脚本,代码如下,挂在FPS控制器身上。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ShootTest : MonoBehaviour
{
	void Update ()
    {
        RaycastHit hit;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Physics.Raycast(ray, out hit))
        {
            Debug.Log(hit.collider);

            if (hit.collider.gameObject.tag == "Fire")
            {
                Debug.Log("前方有火");
            }
        }
    }   
}

同时为了加强说服力我们把火焰粒子物体的标签改为“Fire”,并把层设置为“Player”,然后修改其身上的脚本如下,运行游戏

sing System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FireTest : MonoBehaviour
{
    private void OnParticleCollision(GameObject other)
    {
        Debug.Log("粒子发生碰撞");

        if (other.tag == "Player")
        {
            Debug.Log("一个玩家已死亡");
        }
    }
}

运行后我们,当我们把镜头转向火时只打印了地面,无论怎么改变镜头朝向都没有其他打印
在这里插入图片描述
经过这个例子,我想大家已经明白吧,首先射线不含有碰撞器组件,所以无法被粒子检测到,其次,粒子碰撞只是粒子组件的一个属性,所以也不能算成是碰撞器组件,而射线其实能够检测的也只有带有碰撞器组件的物体。
为了验证我的射线代码没有问题,我在场景中放了一个Cube,将其标签设置为“Fire”,如下:
在这里插入图片描述
这时运行游戏可以看到如下打印,说明我的射线代码也没有问题:
在这里插入图片描述
综上所述,得出结论 射线与粒子的碰撞器是无法发生碰撞 的。这是Unity这个引擎的问题,不是我们用代码可以解决的。

粒子与粒子的碰撞

最后让我们看一下粒子和粒子之间的碰撞,这个也是我在项目中实践发现的问题,因为我们的项目需要做一个水粒子扑灭火粒子的功能,所以也是自然就像到粒子之间是否会发生碰撞。
废话不多说,还是用实践来检验:
还用刚才的场景,不过这次不必用FPS控制器,所以删掉它,加一个摄像机,调好角度能看到火焰粒子就好。然后加入一个水的粒子(这个粒子您也可以随便加,只要保证粒子有初始速度,并且往火粒子那边发射就好),水粒子也同样要开启碰撞,设置同上,把 Colliders With 设置为“Everything”来增强说服力,调节好碰撞器大小,不要勾选 Play On Awake 因为我们要用代码控制粒子播放 ,接下来写脚本,代码如下,脚本拖到水粒子身上。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WaterTest : MonoBehaviour
{
    private ParticleSystem par;

    void Start()
    {
        par = GetComponent<ParticleSystem>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Q))
        {
            par.Play();
        }
    }

    private void OnParticleCollision(GameObject other)
    {
        if (other.tag == "Fire")
        {
            Debug.Log("水粒子碰到了火粒子");
        }
    }
}

运行游戏,运行后按下Q键,可以看到水粒子落下,但是没有任何打印:
在这里插入图片描述
综上所述,得出结论 粒子与粒子之间无法发生碰撞 。

对于以上问题的我的解决方案

根据以上我们得出的结论,我们知道了 粒子的碰撞器只能和带有碰撞器组件的物体发生碰撞并触发事件 ,由于射线和粒子本身都不带有碰撞器组件,所以是无法发生碰撞的,那么这两种情况我们要怎么实现呢,以下仅是我个人能够想到的解决方案,但不一定是最好的,如果有大神有更好的解决方案 欢迎提出:

对于射线无法检测的解决方案

我能想到三种解决方法:
1、直接给需要检测的粒子物体加触发器,触发器区域要比粒子碰撞器能到达的最远区域大,从而在玩家即将进入粒子区域时通过 On Trigger Enter 通知玩家,该方法无法在玩家离粒子较远时使用,并且也不会随着玩家视野旋转而产生不同的通知(例如烟区域和火区域的区分);
2、给粒子物体加一个空子物体,在子物体上加碰撞器,给子物体设置一个单独的层,使该层的碰撞器不会碰到玩家,从而不会影响玩家移动,在下图窗口中有碰撞矩阵的设置,可以修改各层之间的碰撞。然后还是玩家发射射线,来检测子物体的碰撞器,该方法可能会影响到粒子的碰撞,不是很推荐,但是效果最好。
在这里插入图片描述
3、让粒子系统所在物体向自身所在环形区域发射射线,检测玩家后修改玩家身上记录区域的变量,此方法弥补了前两种方法的不足,但是最费性能,不推荐在手机游戏种使用。

对于粒子之间无法检测的解决方案

由于粒子的特殊性,暂时只能想到一种解决方法:
给其中一个粒子加一个碰撞器或者给其子物体加碰撞器。
但是请不要给粒子系统所在物体加刚体,我试过,会发生奇怪的现象,暂时还没有搞清楚这个现象的原因:粒子会掉在地上,弹跳几下,然后迅速飞走…………
可以给加了碰撞器的子物体加刚体,然后在粒子播放时触发刚体,从而到达和水粒子一起碰到火粒子的效果

以上内容,都为我个人看法和实践得出结论,如果说的不妥当处还望前辈高人指点,完结撒花……

unity 粒子系统实现碰撞检测(collision)且使粒子不受力 我在网上搜索到文章说将设置都置0,并且不选择三个Multiply就可以使得粒子不受力,但是我尝试后还是不行,所以决定用代码的方式修改粒子,让其保持属性。因为trigger虽然不会使粒子受力,但是在触发回调函数中,只能够获得被触发的粒子,较难获得激活物体。需求:通过碰撞检测的方式,获得粒子碰撞到的物体,并且碰撞之后,粒子的运动方向,旋转等物理性质都保持不变。勾选Collision ,碰撞对象层级可以在Collides With上选择。如图,选择之后,粒子只能碰撞到 Layer为EnemyRoot的物体。 阅读详情

相关推荐

unity 粒子系统

最近在弄一个3d弹幕类游戏,美术给的子弹都是多个粒子系统的叠加,大量的子弹以及特效造成了系统的卡顿、丢帧严重。想来想去,无奈只好想出歪招,把粒子系统作为一个武器,粒子作为子弹,除了效果不好些,却也解决了问题。今天就写写粒子碰撞时遇到的问题。首先,作为子弹,碰撞是不可少的。要是粒子也带碰撞,可以按下图进行设置。其中,Collision部分必须勾上,才会产生碰撞。如果要在脚本中能够接受到碰撞信息,则必须

xiaocainiao_2015的博客 2169

Unity粒子系统

粒子系统(3)CollisionTriggersSub EmittersTexture Sheet AnimationLightsTrailsCustom DataRenderer Collision Planes:弹出菜单 选择 Planes 模式。 Planes:用于定义碰撞平面的变换的可扩展列表。 Visualization:选择要将 Scene 视图中的碰撞平面辅助图标显示为线框网格还是实体平面。 Scale Plane用于可视化的平面大小。 Dampen:粒子碰撞后损失的速度比例。 Bounce

tongmeng_yiran的博客 4978

详解Unity中的粒子系统Particle System (七)

本篇来讲一讲Collision和Triggers模块,这两个模块主要用于粒子系统与物理世界的交互,一个是碰撞器,另一个是触发器。有了这两个模块我们又可以做出更炫酷的粒子效果啦!

梦小天幼的博客 9711

unity新粒子系统的碰撞和触发

unity中新的粒子系统中碰撞: 首先勾选粒子系统属性面板上的collision,然后勾选send collision messages,就可以从代码中检测粒子的碰撞了; 这里捡几个重要的属性说明一下: dampen 抑制 取值范围0-1,当为1时,粒子碰到碰撞器后会消失; bounce 反弹 让粒子碰到碰撞器后反弹回去; colliders with 选择可以发生碰撞的层; ...

天行九歌 2万+

unity粒子系统之雪花、烟花

unity实现雪花飘落,烟花绽放效果

m0_67750738的博客 4168

Unity粒子碰撞事件 ParticleCollisionEvent

小白欢迎评论,共同探讨,共同进步   首先介绍一下 OnParticleCollision() 函数。 MonoBehaviour.OnParticleCollision(GameObject) 当粒子碰撞了collider非Trigger就会触发绑定了该脚本的 OnParticleCollision  函数。 这个可以用于游戏对象被粒子击中时应用伤害到它上面。 对

黑色、最低调的奢华ㄛ的博客 1万+

【游戏开发实战】Unity使用ParticleSystem粒子系统模拟药水在血管中流动(粒子碰撞)

文章目录一、前言二、最终效果三、制作过程1、导入血管模型2、血管Shader3、血管材质球4、添加碰撞体5、药水粒子四、测试效果五、结束语 一、前言 点关注不迷路,持续输出Unity干货文章。 嗨,大家好,我是新发。 之前我写了一篇Unity流体模拟的文章:《Unity流体模拟,支持粒子系统,支持流体碰撞交互(Obi Fluid插件使用教程)》 然后有同学私信我,问我能否做药剂打入血管的效果。 这个嘛,用ObiFluid可以做,不过我今天要尝试的,是用另一种方式:直接使用Unity的粒子系统来做。 二、最

linxinfa的专栏 6129

unity中设置子弹碰撞特效

unity中设置子弹碰撞特效,子弹碰撞特效第一想到的就是粒子系统........

CertainLan的博客 2794

[Unity]_粒子系统作触发器/碰撞器使用

粒子系统做碰撞器 using System.Collections; using System.Collections.Generic; using UnityEngine; public class cubeBase : MonoBehaviour { public void OnParticleCollision(GameObject other) { if (other.tag== "Player") { De.

—巨人绿 4190

在 Zemax 非序列模式下建立干涉仪模型

Zemax 利用其相干检测功能,将到达探测器的射线的能量相干地组合起来,同时考虑每条检测到的射线的幅度和相位。从对这些干涉条纹的定量评估来看,光学干涉仪具有广泛的应用,包括在天文学中用于测量天体的大小,在计量学中用于精确测量距离,在显微镜中用于提高分辨率,以及在物理和工程的各个领域中用于检测条件的微小变化。在光学干涉仪中,使用的是光波。非相干和相干相加的总功率是守恒的,但相干光束的峰值辐照度应该是非相干光束总和的 2 倍,这是理所当然的。请注意,条纹的缺失是显而易见的,因为不再从相干的角度观察探测器。

jkh920184196的博客 2381

ADS入门学习笔记——低噪声放大器(2)

1、输入匹配网络; 2、输出匹配网络;

weixin_42126696的博客 4990

unity粒子系统制作火的效果和碰撞触发入门

&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;最近使用到unity的粒子系统particle system,制作火的效果并用于交互。通过以下链接简单入门。 一、粒子系统制作火的效果 u3d游戏特效教程_基础教程_火把篝火特效制作:https://jingyan.baidu.com/article/eae0782786bdc11fec54853c.html 分享一个资源包(里面包含以上制作需要的素...

u013950379的博客 4145

Unity的粒子系统

Unity的粒子系统(Particle System)是一种强大的工具,用于在游戏和应用程序中创建各种视觉效果。它能够模拟并渲染许多称为粒子的小图像或网格,以产生火焰、烟雾、爆炸等自然现象和其他特效。

🌟【AI炼丹师 | 你的数字技术搭子】 大二解锁3200+道友同行👾 2620

全志 mipi屏幕和触摸驱动调试记录

mipi屏幕与触摸调试记录

u011996684的博客 3220

使用Python实现卷积神经网络(CNN)

卷积神经网络是一种专门用于处理具有网格状拓扑结构数据(如图像、声音)的深度学习模型。CNN的核心组件是卷积层和池化层,它们能够有效地从图像中提取特征并实现空间不变性,使得模型能够对图像中的物体进行识别和分类。我们定义一个简单的卷积神经网络模型,包括卷积层、池化层和全连接层。return x# 创建模型实例我们选择交叉熵损失函数作为分类任务的损失函数,并使用随机梯度下降(SGD)作为优化器。

Echo_Wish 4489

unity粒子系统属性介绍

应公司要求分享unity自带的粒子系统,借此契机,总结了unity5.6.1粒子系统大部分属性。 1、初始化模块 duration:粒子系统发射粒子的持续时间。 Looping:粒子循环 Prewarm:粒子预热,若开启,则粒子系统在游戏运行初始就已经发射粒子了,只有在粒子系统循环播放下才能开启此项。 Start delay:粒子初始延迟,在开启粒子预热时无法使用此项。 Start l...

yq398934906的博客 1万+

手把手教你玩转CPU微架构--​第三章:乱序执行的“魔法”——如何让指令“插队”提升效率​​3.4 动手实验:用Gem5模拟器分析乱序执行对IPC的提升(对比顺序执行)

摘要:本章通过Gem5模拟器对比乱序执行(O3CPU)和顺序执行的性能差异,实验采用SPECCPU2017和PARSEC3.0基准测试,配置7级流水线、4指令/周期发射宽度及多级缓存。结果显示,乱序执行平均提升IPC超过100%,关键因素包括动态指令调度、缓存命中率提升(L1达92%)和TAGE分支预测(准确率95%)。优化方向包括增大指令缓存和发射队列深度。实验验证了乱序执行在减少流水线停顿和提升吞吐量方面的显著优势。

MHD0815的博客 165

unity粒子系统笔记

做Unity这么久很久没有写笔记了,这个比例记录一下Unity粒子系统属性,方便以后工作查阅。 初始化模块 duration:粒子系统发射粒子的持续时间。 Looping:粒子循环 Prewarm:粒子预热,若开启,则粒子系统在游戏运行初始就已经发射粒子了,只有在粒子系统循环播放下才能开启此项。 Start delay:粒子初始延迟,在开启粒子预热时无法使用此项。 Start life...

龚韬的专栏 2847

芒果YOLOv8改进72:动态标签分配策略篇之ATSS:自适应训练样本选择Adaptive Training Sample Selection策略

YOLOv8代码实践|ATSS标签分配策略改进🥭

包括YOLOv5、YOLOv7、YOLOv8等模型改进 2909

Python控制TEMI1000/TEMI1500测试温箱

该温箱是我司从昆山振弘检测设备有限公司采购的TEMI 1000,但是控制器用的是韩国的,关于控温箱这个项目,可参考的资料仅有一份官方的manual,里面包含一些命令格式。只要你有温箱,就应该可以向厂家索取该文档。该温箱的通讯接口只有一个RS232接口,要想实现远程控制,需要有串口转USB的线;类似于下图所以,想依靠python来与之进行通信,还是要通过python 的pyserial库,关于怎么安装pyserial,过于简单,这里不做赘述,可自行百度。

xgh1951的博客 1万+

Unity利用粒子系统模拟下雪积雪效果

按我个人能力,这个方案的解决有两种方式 1、  运用shader的法线和夹角来决定积雪位置,强度,厚度; 2、  运用粒子系统下雪,利用粒子碰撞检测生成雪花落地,因为大批量的雪花其实是一张张图片组成的,把他们的载体网格合并成一个大的全删掉,不停的添加新生成的地上的雪花; 我现在来说一下这个简单的模拟下雪,因为很方便所以才说一说,适合当做PlanB  如果能用shader做的千万别用这个,好l

Unity 2万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Unity粒子系统碰撞检测与物理水花效果实现

粒子系统是游戏开发中实现动态视觉效果的核心技术之一,它通过模拟大量微小粒子的行为来创建烟雾、火焰、水流等自然现象。其原理基于对粒子位置、速度、生命周期等属性的程序化控制,结合物理引擎的碰撞检测与动力学计算,能够实现高度逼真的交互式效果。在游戏、影视特效和交互式媒体中,粒子系统对于提升场景沉浸感和视觉真实感具有重要价值,尤其适用于天气模拟、魔法特效、环境交互等场景。本文以Unity引擎为例,深入探讨如何通过双粒子系统架构,结合碰撞事件处理与参数化控制,实现基于物理规则的雨滴撞击水花效果,其中涉及碰撞检测优化与

weixin_29016833的博客 287

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【Unity 粒子系统】Collision 模块

Collision龙族语录属性结语 龙族语录 ????????总有一些孤独,曾在我们左右;也总有一些孤独,离我们远去,让我们无从寻觅。一切都过去了,是的。阳光里,不会再有天使低下头来,亲吻你的脸。 --江南 《龙族》 属性 此模块控制粒子如何与场景中的游戏对象碰撞。使用第一个下拉选单可定义碰撞设置是应用于 Planes 还是应用于 World。如果选择 World__,请使用 Collision Mode__ 下拉选单定义碰撞设置是应用于 2D 还是 3D 世界。 Planes模块属性: Planes:

weixin_43043100的博客 3833

Unity粒子系统碰撞检测优化:保持粒子物理属性不变

本文深入探讨了Unity粒子系统碰撞检测的优化方案,旨在解决粒子碰撞后物理属性被意外修改的痛点。通过分析碰撞处理流程,提供了详细的代码实现,核心在于捕获并锁定粒子的“标准状态”,在碰撞后强制恢复其速度、旋转等属性,从而实现“粒子不受力”的精确控制,适用于需要碰撞触发事件但保持运动轨迹不变的场景。

weixin_28049429的博客 458

Unity中 粒子系统使用整理(一)

Unity中内置粒子系统的使用整理

weixin_50702814的博客 2489
下一篇: Unity实现流水灯的几种思路(类比嵌入式)
酱者
博客等级 码龄8年 4粉丝 2原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值