碰撞概述

概括叙述虚幻引擎4中的碰撞和碰撞响应的工作原理。

Windows
MacOS
Linux

碰撞响应追踪响应 构成了虚幻引擎4在运行时处理碰撞和光线投射的基础。能够碰撞的每个对象都有 对象类型 和一系列响应,用来定义它与所有其他对象类型交互的方式。当碰撞或重叠事件发生时,涉及的两个(或全部)对象都会发出或受到阻挡、重叠或忽略的作用。

追踪响应 的原理基本相同,唯一的区别是追踪(光线投射)本身可以定义为一种追踪响应类型,因此Actor可以根据_其_追踪响应阻挡或忽略。

交互

关于碰撞的处理方式,需要记住几点规则:

  • 阻挡 会设置为阻挡的两个(或更多)Actor之间自然发生。但是,需要启用 模拟生成命中事件(Simulation Generates Hit Events) 才能执行 事件命中,该功能在蓝图、可破坏物Actor、触发器等处使用。

  • 将Actor设置为 重叠 往往看起来它们彼此 忽略,如果没有 生成重叠事件(Generate Overlap Events),则二者基本相同。

  • 对于彼此阻挡的两个或更多模拟对象,它们都需要设置为阻挡相应的对象类型。

  • 对于两个或更多模拟对象:如果一个设置为重叠对象,另一个设置为阻挡对象,则发生重叠,而不会发生阻挡。

  • 即使一个对象会 阻挡 另一个对象,也 可以 生成重叠事件,尤其是高速运行的对象。

    • 不建议一个对象同时拥有碰撞和重叠事件。虽然可以,但需要手动处理的部分太多。

  • 如果一个对象设置为忽略,另一个设置为重叠,则不会触发重叠事件。

对于测试关卡和检视场景目的:

  • 默认的 在编辑器中运行 摄像机是一个Pawn。因此可以被设置为阻挡Pawn的任何对象阻挡。

  • 在编辑器中模拟 摄像机在处理任何事务之前**不是**Pawn。它可以自由穿过任何对象,不会造成任何碰撞或重叠事件。

常见碰撞交互示例

这些交互假设所有对象的 启用碰撞 设置为 启用碰撞,这样它们就设置为与任何对象发生完全碰撞。如果禁用碰撞,就像所有 碰撞响应 都设置为 忽略 一样。

在下一节中,将通过这种设置来解释实际发生的情况:

COL_setup.png

该球体是 物理形体(PhysicsBody),箱体是 场景动态(WorldDynamic),通过更改它们的碰撞设置,我们可以得出多种行为。

碰撞

通过将二者的碰撞设置设定为互相阻挡,可以得到碰撞,非常有利于产生对象彼此交互的效果。

COL_collideNoEvent.png

球体碰撞设置

墙壁碰撞设置

COL_collideNoEvent_Sphere.png

COL_collideNoEvent_Box.png

在本例中,球体是 物理形体(PhysicsBody),它设置为阻挡(block)场景动态(WorldDynamic)(这是墙壁的类型)。

墙壁是 场景动态(WorldDynamic),它设置为阻挡(block)物理形体(PhysicsBody)Actor(这是球体的类型)。

在本例中,球体和墙壁只是发生碰撞,不会有进一步的碰撞通知。

碰撞和模拟生成命中事件

只是碰撞有一定用处,总的来说,就是物理交互的最基础作用,但如果你希望 报告 发生了碰撞,以便触发蓝图或一段代码:

COL_collideEvent.png

球体碰撞设置

墙壁碰撞设置

COL_collideEvent_Sphere.png

COL_collideNoEvent_Box.png

在以上示例中,球体是 物理形体(PhysicsBody),它设置为阻挡(block)场景动态(WorldDynamic)(这是墙壁的类型)。但是,球体也启用了 模拟生成命中事件(Simulation Generates Hit Events),这样每当它发生碰撞时就会针对自己触发事件。

墙壁是 场景动态(WorldDynamic),它设置为阻挡(block)物理形体(PhysicsBody)Actor(这是球体的类型)。由于墙壁没有设置为 模拟生成命中事件(Simulation Generates Hit Events),因此不会针对自己生成事件。

通过将球体设置为 模拟生成命中事件(Simulation Generates Hit Events),球体就会告诉自己发生了碰撞。它会触发球体蓝图中的事件,例如 ReceiveHitOnComponentHit。现在,如果箱体发生了碰撞事件,则不会触发,因为它永远不会通知自己发生了碰撞。

此外,报告刚性碰撞的对象将汇报所有报告,包括它们坐在某个对象上时的垃圾报告,所以最好在蓝图或代码中仔细过滤碰撞的对象。

重叠和忽略

如果禁用了 生成重叠事件(Generate Overlap Events),则不管目的为何,重叠忽略 的效果完全相同。在此情况下,球体设置为重叠或忽略箱体:

COL_ignore.png

球体碰撞设置

墙壁碰撞设置

COL_OverlapNoEvent_Sphere.png

COL_collideNoEvent_Box.png

这里的球体设置为重叠(overlap)场景动态(WorldDynamic)Actor(比如墙壁),但没有启用 生成重叠事件(Generate Overlap Events)。就球体而言,它没有与任何对象碰撞或重叠,它实际上是忽略墙壁。

墙壁是 场景动态(WorldDynamic),它设置为阻挡(block)物理形体(PhysicsBody)Actor(这是球体的类型)。如上所述,两个Actor都需要设置为阻挡彼此相应的对象类型。如果不这样设置,就不会发生碰撞。

或者:

球体碰撞设置

墙壁碰撞设置

COL_ignore_sphere.png

COL_collideNoEvent_Box.png

这里的球体设置为忽略(ignore)场景动态(WorldDynamic)Actor(比如墙壁),并穿过墙壁。

墙壁是 场景动态(WorldDynamic),它设置为阻挡(block)物理形体(PhysicsBody)Actor(这是球体的类型)。如上所述,两个Actor都需要设置为阻挡彼此相应的对象类型。如果不这样设置,就不会发生碰撞。

重叠和生成重叠事件

与可以随时触发的碰撞不同,重叠事件是 ReceiveBeginOverlapReceiveEndOverlap,仅在特定情况下触发。

为了使重叠发生,两个Actor都需要启用 生成重叠事件(Generate Overlap Events)。这是为效果考虑。如果球体和箱体都希望在我们移动球体或箱体时发生重叠,则执行重叠查询以确认是否需要触发任何事件。

如果箱体不希望在移动时发生重叠,则不执行重叠查询。但现在,可以与球体重叠,因此球体需要tick事件,并逐帧检查是否有重叠以防有对象与它们相撞。

COL_overlapEvent.png

球体碰撞设置

墙壁碰撞设置

COL_OverlapEvent_Sphere.png

COL_collideOverLapEvent_Box.png

这里的球体设置为重叠(overlap)场景动态(WorldDynamic)Actor(比如墙壁),它会在发生重叠时针对自己生成事件。

墙壁是 场景动态(WorldDynamic),它设置为阻挡(block)物理形体(PhysicsBody)Actor(这是球体的类型)。如上所述,两个Actor都需要设置为阻挡彼此相应的对象类型。如果不这样设置,就不会发生碰撞。但是,这里会发生 重叠,并触发球体和箱体的事件。

欢迎来到全新虚幻引擎4文档站!

我们正在努力开发新功能,包括反馈系统,以便您能对我们的工作作出评价。但它目前还未正式上线。如果您对此页面有任何意见与在使用中遭遇任何问题,请前往文档反馈论坛告知我们。

新系统上线运行后,我们会及时通知您的。

发表反馈意见