目录
一、碰撞概述
能够碰撞的每个对象都有 对象类型 和一系列响应,用来定义它与所有其他对象类型交互的方式。当碰撞或重叠事件发生时,涉及的两个(或全部)对象都会发出或受到阻挡、重叠或忽略的作用。
关于碰撞的处理方式,需要记住几点规则:
- 阻挡 会设置为阻挡的两个(或更多)Actor之间自然发生。但是,需要启用 模拟生成命中事件(Simulation Generates Hit Events) 才能执行 事件命中,该功能在蓝图、可破坏物Actor、触发器等处使用。
- 将Actor设置为 重叠 往往看起来它们彼此 忽略,如果没有 生成重叠事件(Generate Overlap Events),则二者基本相同。
- 对于彼此阻挡的两个或更多模拟对象,它们都需要设置为阻挡相应的对象类型。
- 对于两个或更多模拟对象:如果一个设置为重叠对象,另一个设置为阻挡对象,则发生重叠,而不会发生阻挡。
- 即使一个对象会 阻挡 另一个对象,也 可以 生成重叠事件,尤其是高速运行的对象。
- 不建议一个对象同时拥有碰撞和重叠事件。虽然可以,但需要手动处理的部分太多。
- 如果一个对象设置为忽略,另一个设置为重叠,则不会触发重叠事件。
对于测试关卡和检视场景目的:
- 默认的 在编辑器中运行 摄像机是一个Pawn。因此可以被设置为阻挡Pawn的任何对象阻挡。
- 在编辑器中模拟 摄像机在处理任何事务之前不是Pawn。它可以自由穿过任何对象,不会造成任何碰撞或重叠事件。
常见碰撞交互示例
该球体是 物理形体(PhysicsBody),箱体是 场景动态(WorldDynamic),通过更改它们的碰撞设置,我们可以得出多种行为。
1. 碰撞
通过将二者的碰撞设置设定为互相阻挡,可以得到碰撞,非常有利于产生对象彼此交互的效果。
2. 碰撞和模拟生成命中事件
只是碰撞有一定用处,总的来说,就是物理交互的最基础作用,但如果你希望 报告 发生了碰撞,以便触发蓝图或一段代码:
通过将球体设置为 模拟生成命中事件(Simulation Generates Hit Events),球体就会告诉自己发生了碰撞。它会触发球体蓝图中的事件,例如 ReceiveHit 或 OnComponentHit。现在,如果箱体发生了碰撞事件,则不会触发,因为它永远不会通知自己发生了碰撞。
3. 重叠和忽略
如果禁用了 生成重叠事件(Generate Overlap Events),则不管如何,重叠 和 忽略 的效果完全相同。在此情况下,球体设置为重叠或忽略箱体:
4. 重叠和生成重叠事件
与可以随时触发的碰撞不同,重叠事件是 ReceiveBeginOverlap 和 ReceiveEndOverlap,仅在特定情况下触发。
总结:我们也可以通过【编辑】-【项目设置】-【碰撞】中新建自定义通道。也就是类似下面的通道。
二、为静态网格体设置碰撞体积
当然我们也可以在建模软件中设置自定义碰撞(效果好且节省资源),这样导入的静态网格体本身就有碰撞体积了。
三、碰撞事件
个人理解:对于静态网格体资产,我们最好不要直接拖入场景中。我们可以为其创建一个蓝图类,这样后续通信比较方便。
我们可以看到 chair 蓝图类和之前我们学习的角色蓝图类非常相像,同样右侧都有一些事先定义好的事件,我们可以将其添加到事件图表中。
四、小案例
4.1 案例一
案例一:我想实现从角色手中发射一个小球(动画省略),然后小球碰到哪个物体,物体就销毁。
首先创建 ball 蓝图类,内部操作如下。
接下来操作角色蓝图类。
4.2 案例二
案例二:我想实现从角色手中发射一个小球(动画省略),然后小球碰到桌子(HP=100),小球伤害为50,也就是说需要攻击两次,桌子才会死亡。
这里我想加一个小功能,角色释放技能给桌子回满血(这里假设按键盘的 h 键)。使用事件分发器。
在角色方创建事件分发器并调用。
椅子方绑定事件分发器。
注:这里我本来想不用事件分发器的形式,直接在角色方设置,但好像在角色方不能修改椅子方的变量(生命)。