虚幻学习笔记14—重叠和碰撞事件

一、前言

        在开发应用当中两个物体的重叠和碰撞事件会经常用到,在虚幻中哲两个有很大的区别,在官方文档碰撞概述其实已经讲了怎样发生碰撞和重叠,但是还是遗漏不少注意事项合细节,主要文档写的太粗糙了,这也让我在使用的时候产生了很多困惑,尤其是碰撞。

        本文使用的虚幻引擎版本为5.2.1。

二、实现

        首先创建两个蓝图,分别添加Cube和Plane组件,Cube作为主动接触的一方,Plane作为被动的一方。

2.1、实现重叠事件

1、要发生重叠最重要的是两个物体都要设置“生成重叠事件”和选择带“查询”的碰撞已启用

        如2.1.1所示,将两个蓝图的这个都勾上,这点和碰撞是最大的不同,两个物体都要在碰撞预设-》碰撞已启用中设置带有”查询“的选项,如“纯查询”、“已启用碰撞(查询和物理)”、”查询和探测”。这两个物体可以在上述三种带查询中任意选择,可以不用两个完全一样,如Cube选择“纯查询”,Plane可以在“纯查询”、“已启用碰撞(查询和物理)”、”查询和探测”任意选择一个都会发生重叠事件。

 Cube的设置
Plane的设置
图2.1.1

2、检测响应中其中一个设置了和对方的重叠,另外一个需要设置和该物体的非忽略即可

        两个物体只要有一个设置了和另外物体的重叠,另外一个物体除非设置忽略,那么可以触发重叠事件,并且两个物体都能触发事件处理。

        如2.1.2所示为两个物体的设置,其中Cube的对象类型为WolrdDynamic、Plane为Physics Body。Cube的检测响应中针对PhysicsBody设置为重叠,而Plane中设置检测想要中针对WolrdDynamic的类型除了忽略可以设置为重叠和阻挡。

Cube设置和Plane重叠
Plane设置和Cube的重叠或阻挡
图2.1.2

3、两个物体都可以接受到重叠事件,但是执行的前后顺序会和谁撞谁有关

        在处理重叠事件中,两个物体都可以创建“组件开始重叠时”的事件并进行处理,如图2.1.3所示分别在两个物体中处理该事件。但是在执行顺序上会有所差别,如果是Cube撞上Plane,那么就会

Cube中打印“我是Cube”
Plane中打印“我是Plane”
图2.1.3

先执行Cube中的事件,然后再执行Plane上的事件,反之则相反。如同2.1.4所示。但是如果两个都运动的话,以谁速度快就先执行对方。注:打印屏幕上的消息是在上面的后执行、最下面的是先执行的。

图2.1.4
2.2、实现碰撞事件

        碰撞是比较复杂的,相比重叠来说它需要注意的事情就更多。

1、两个物体的“碰撞已启用”都要设置带物理的选项

        两个物体的“碰撞已启用”都要设置带物理的选项,如“纯物理”、“已启用碰撞”,这两个可以任意组合,比如Cube选择了“纯物理”,plane可以选择“纯物理”或“已启用碰撞”,如图2.2.1所示

Cube选择了“纯物理”
Plane选择“已启用碰撞”
图2.2.1

2、两个物体针对对方的检测响应必须都是阻挡

        如图2.2.2所示,两个物体的检测响应针对对方的都必须是阻挡。

Cube针对Plane的设置为阻挡
Plane针对Cube的设置为阻挡
图2.2.2

3、其中一个必须开启“模拟生产命中事件”

        其中一个物体必须开启,开启后会自动触发“组件命中时”事件,没有勾选该项的不会出发“组件命中时”事件。如图2.2.3所示为两个物体我都勾选并在事件处理中打印Debug信息。

Cube勾选事件并处理

Plane勾选时间并处理
图2.2.3

4、其中一个必须开启“模拟物理“

        这是碰撞最难以把握的一点,Cube勾选“模拟物理”,Plane不勾选“模拟物理”。这一点在官方文档中是没有提及的,也是让我在头疼不已中才发现的最重要的一点。

5、触发碰撞的事件顺序好像和谁的没有关系

        无论我试了什么情况都是先执行Cube上的事件,然后再执行Plane的事件,但是我概关闭再次重启整个编辑器之后又是相反的结果,这也是最诡异的地方。

三、总结

3.1、要发生重叠最重要的是两个物体都要设置“生成重叠事件”。

3.2、重叠的两个物体的处理事件先后顺序有规律,碰撞的暂时没什么规律。

猜你喜欢

转载自blog.csdn.net/zhangxiao13627093203/article/details/134972336