碰撞概述

概括叙述虚幻引擎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都需要设置为阻挡彼此相应的对象类型。如果不这样设置,就不会发生碰撞。但是,这里会发生 **重叠**,并触发球体和箱体的事件。

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback