一、前言
在开发应用当中两个物体的重叠和碰撞事件会经常用到,在虚幻中哲两个有很大的区别,在官方文档碰撞概述其实已经讲了怎样发生碰撞和重叠,但是还是遗漏不少注意事项合细节,主要文档写的太粗糙了,这也让我在使用的时候产生了很多困惑,尤其是碰撞。
本文使用的虚幻引擎版本为5.2.1。
二、实现
首先创建两个蓝图,分别添加Cube和Plane组件,Cube作为主动接触的一方,Plane作为被动的一方。
2.1、实现重叠事件
1、要发生重叠最重要的是两个物体都要设置“生成重叠事件”和选择带“查询”的碰撞已启用
如2.1.1所示,将两个蓝图的这个都勾上,这点和碰撞是最大的不同,两个物体都要在碰撞预设-》碰撞已启用中设置带有”查询“的选项,如“纯查询”、“已启用碰撞(查询和物理)”、”查询和探测”。这两个物体可以在上述三种带查询中任意选择,可以不用两个完全一样,如Cube选择“纯查询”,Plane可以在“纯查询”、“已启用碰撞(查询和物理)”、”查询和探测”任意选择一个都会发生重叠事件。
2、检测响应中其中一个设置了和对方的重叠,另外一个需要设置和该物体的非忽略即可
两个物体只要有一个设置了和另外物体的重叠,另外一个物体除非设置忽略,那么可以触发重叠事件,并且两个物体都能触发事件处理。
如2.1.2所示为两个物体的设置,其中Cube的对象类型为WolrdDynamic、Plane为Physics Body。Cube的检测响应中针对PhysicsBody设置为重叠,而Plane中设置检测想要中针对WolrdDynamic的类型除了忽略可以设置为重叠和阻挡。
3、两个物体都可以接受到重叠事件,但是执行的前后顺序会和谁撞谁有关
在处理重叠事件中,两个物体都可以创建“组件开始重叠时”的事件并进行处理,如图2.1.3所示分别在两个物体中处理该事件。但是在执行顺序上会有所差别,如果是Cube撞上Plane,那么就会
先执行Cube中的事件,然后再执行Plane上的事件,反之则相反。如同2.1.4所示。但是如果两个都运动的话,以谁速度快就先执行对方。注:打印屏幕上的消息是在上面的后执行、最下面的是先执行的。
2.2、实现碰撞事件
碰撞是比较复杂的,相比重叠来说它需要注意的事情就更多。
1、两个物体的“碰撞已启用”都要设置带物理的选项
两个物体的“碰撞已启用”都要设置带物理的选项,如“纯物理”、“已启用碰撞”,这两个可以任意组合,比如Cube选择了“纯物理”,plane可以选择“纯物理”或“已启用碰撞”,如图2.2.1所示
2、两个物体针对对方的检测响应必须都是阻挡
如图2.2.2所示,两个物体的检测响应针对对方的都必须是阻挡。
3、其中一个必须开启“模拟生产命中事件”
其中一个物体必须开启,开启后会自动触发“组件命中时”事件,没有勾选该项的不会出发“组件命中时”事件。如图2.2.3所示为两个物体我都勾选并在事件处理中打印Debug信息。
4、其中一个必须开启“模拟物理“
这是碰撞最难以把握的一点,Cube勾选“模拟物理”,Plane不勾选“模拟物理”。这一点在官方文档中是没有提及的,也是让我在头疼不已中才发现的最重要的一点。
5、触发碰撞的事件顺序好像和谁的没有关系
无论我试了什么情况都是先执行Cube上的事件,然后再执行Plane的事件,但是我概关闭再次重启整个编辑器之后又是相反的结果,这也是最诡异的地方。
三、总结
3.1、要发生重叠最重要的是两个物体都要设置“生成重叠事件”。
3.2、重叠的两个物体的处理事件先后顺序有规律,碰撞的暂时没什么规律。