UE5 <碰撞>

目录

一、碰撞概述

二、为静态网格体设置碰撞体积

三、碰撞事件

四、小案例

4.1 案例一

4.2 案例二


一、碰撞概述

能够碰撞的每个对象都有 对象类型 和一系列响应,用来定义它与所有其他对象类型交互的方式。当碰撞或重叠事件发生时,涉及的两个(或全部)对象都会发出或受到阻挡、重叠或忽略的作用。

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

  • 阻挡 会设置为阻挡的两个(或更多)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 键)。使用事件分发器。

在角色方创建事件分发器并调用。

椅子方绑定事件分发器。

注:这里我本来想不用事件分发器的形式,直接在角色方设置,但好像在角色方不能修改椅子方的变量(生命)。

### 创建和配置碰撞区域 在 Unreal Engine 5 (UE5) 中,创建和配置碰撞区域是一个常见的需求,特别是在处理物理交互、触发器和其他基于空间的游戏逻辑时。为了有效地设置这些区域,开发者通常会利用 `Box Collision` 或其他类型的碰撞组件。 #### 使用 Box Collision 组件 对于简单的矩形或立方体形状的碰撞体积,`Box Collision` 是最常用的选择之一。要向某个 Actor 添加此类碰撞: 1. 打开所需编辑的 Actor 的蓝图或者 C++ 类; 2. 在 Components 面板中右键单击并选择 Add Component -> Box Collision 来添加一个新的盒子型碰撞组件[^1]; ```cpp // Example of adding a box collision component via C++ UBoxComponent* MyBoxCollision = CreateDefaultSubobject<UBoxComponent>(TEXT("MyBoxCollision")); if (MyBoxCollision) { MyBoxCollision->SetupAttachment(RootComponent); } ``` #### 设置碰撞属性 一旦有了碰撞组件之后,就可以调整其大小以及设定与其他对象发生接触时的行为模式。这可以通过修改 `Object Type` 和 `Custom Profile` 参数来完成,从而指定哪些类型的物体能够与该碰撞区互动及其反应方式。 #### 调试可视化 为了让开发过程更加直观,在视图端启用调试显示是非常有帮助的。可以在细节面板中的 `Debug` 分类下找到选项开启此功能,这样就能在游戏中看到实际生效的碰撞边界了[^2]。 #### 测试与优化 最后一步就是反复测试所设定了碰撞效果是否符合预期,并根据实际情况做出相应调整直至满意为止。记得保存工作成果并且定期备份项目文件以防意外丢失重要更改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值