碰撞响应 和 追踪响应 构成了虚幻引擎4在运行时处理碰撞和光线投射的基础。能够碰撞的每个对象都有 对象类型 和一系列响应,用来定义它与所有其他对象类型交互的方式。当碰撞或重叠事件发生时,涉及的两个(或全部)对象都会发出或受到阻挡、重叠或忽略的作用。
追踪响应 的原理基本相同,唯一的区别是追踪(光线投射)本身可以定义为一种追踪响应类型,因此Actor可以根据_其_追踪响应阻挡或忽略。
交互
关于碰撞的处理方式,需要记住几点规则:
- 阻挡 会设置为阻挡的两个(或更多)Actor之间自然发生。但是,需要启用 模拟生成命中事件(Simulation Generates Hit Events) 才能执行 事件命中,该功能在蓝图、可破坏物Actor、触发器等处使用。
- 将Actor设置为 重叠 往往看起来它们彼此 忽略,如果没有 生成重叠事件(Generate Overlap Events),则二者基本相同。
- 对于彼此阻挡的两个或更多模拟对象,它们都需要设置为阻挡相应的对象类型。
- 对于两个或更多模拟对象:如果一个设置为重叠对象,另一个设置为阻挡对象,则发生重叠,而不会发生阻挡。
- 即使一个对象会 阻挡 另一个对象,也 可以 生成重叠事件,尤其是高速运行的对象。
- 不建议一个对象同时拥有碰撞和重叠事件。虽然可以,但需要手动处理的部分太多。
- 如果一个对象设置为忽略,另一个设置为重叠,则不会触发重叠事件。
对于测试关卡和检视场景目的:
- 默认的 在编辑器中运行 摄像机是一个Pawn。因此可以被设置为阻挡Pawn的任何对象阻挡。
- 在编辑器中模拟 摄像机在处理任何事务之前不是Pawn。它可以自由穿过任何对象,不会造成任何碰撞或重叠事件。
常见碰撞交互示例
这些交互假设所有对象的 启用碰撞 设置为 启用碰撞,这样它们就设置为与任何对象发生完全碰撞。如果禁用碰撞,就像所有 碰撞响应 都设置为 忽略 一样。
在下一节中,将通过这种设置来解释实际发生的情况:

该球体是 物理形体(PhysicsBody),箱体是 场景动态(WorldDynamic),通过更改它们的碰撞设置,我们可以得出多种行为。
碰撞
通过将二者的碰撞设置设定为互相阻挡,可以得到碰撞,非常有利于产生对象彼此交互的效果。

球体碰撞设置 | 墙壁碰撞设置 |
---|---|
![]() |
![]() |
在本例中,球体是 物理形体(PhysicsBody),它设置为阻挡(block) 场景动态(WorldDynamic)(这是墙壁的类型)。 |
墙壁是 场景动态(WorldDynamic),它设置为阻挡(block) 物理形体(PhysicsBody)Actor(这是球体的类型)。 |
在本例中,球体和墙壁只是发生碰撞,不会有进一步的碰撞通知。
碰撞和模拟生成命中事件
只是碰撞有一定用处,总的来说,就是物理交互的最基础作用,但如果你希望 报告 发生了碰撞,以便触发蓝图或一段代码:

球体碰撞设置 | 墙壁碰撞设置 |
---|---|
![]() |
![]() |
在以上示例中,球体是 物理形体(PhysicsBody),它设置为阻挡(block) 场景动态(WorldDynamic)(这是墙壁的类型)。但是,球体也启用了 模拟生成命中事件(Simulation Generates Hit Events),这样每当它发生碰撞时就会针对自己触发事件。 |
墙壁是 场景动态(WorldDynamic),它设置为阻挡(block) 物理形体(PhysicsBody)Actor(这是球体的类型)。由于墙壁没有设置为 模拟生成命中事件(Simulation Generates Hit Events),因此不会针对自己生成事件。 |
通过将球体设置为 模拟生成命中事件(Simulation Generates Hit Events),球体就会告诉自己发生了碰撞。它会触发球体蓝图中的事件,例如 ReceiveHit 或 OnComponentHit。现在,如果箱体发生了碰撞事件,则不会触发,因为它永远不会通知自己发生了碰撞。
此外,报告刚性碰撞的对象将汇报所有报告,包括它们坐在某个对象上时的垃圾报告,所以最好在蓝图或代码中仔细过滤碰撞的对象。
重叠和忽略
如果禁用了 生成重叠事件(Generate Overlap Events),则不管目的为何,重叠 和 忽略 的效果完全相同。在此情况下,球体设置为重叠或忽略箱体:

球体碰撞设置 | 墙壁碰撞设置 |
---|---|
![]() |
![]() |
这里的球体设置为重叠(overlap) 场景动态(WorldDynamic)Actor(比如墙壁),但没有启用 生成重叠事件(Generate Overlap Events)。就球体而言,它没有与任何对象碰撞或重叠,它实际上是忽略墙壁。 |
墙壁是 场景动态(WorldDynamic),它设置为阻挡(block) 物理形体(PhysicsBody)Actor(这是球体的类型)。如上所述,两个Actor都需要设置为阻挡彼此相应的对象类型。如果不这样设置,就不会发生碰撞。 |
或者:
球体碰撞设置 | 墙壁碰撞设置 |
---|---|
![]() |
![]() |
这里的球体设置为忽略(ignore) 场景动态(WorldDynamic)Actor(比如墙壁),并穿过墙壁。 |
墙壁是 场景动态(WorldDynamic),它设置为阻挡(block) 物理形体(PhysicsBody)Actor(这是球体的类型)。如上所述,两个Actor都需要设置为阻挡彼此相应的对象类型。如果不这样设置,就不会发生碰撞。 |
重叠和生成重叠事件
与可以随时触发的碰撞不同,重叠事件是 ReceiveBeginOverlap 和 ReceiveEndOverlap,仅在特定情况下触发。
为了使重叠发生,两个Actor都需要启用 生成重叠事件(Generate Overlap Events)。这是为效果考虑。如果球体和箱体都希望在我们移动球体或箱体时发生重叠,则执行重叠查询以确认是否需要触发任何事件。
如果箱体不希望在移动时发生重叠,则不执行重叠查询。但现在,可以与球体重叠,因此球体需要tick事件,并逐帧检查是否有重叠以防有对象与它们相撞。

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