UE5-OnHit和OnOverlap事件触发
一、先说说UE5中的碰撞(Collision)
检测响应(射线)和物体响应:
Block(阻挡) 比如:大树或墙阻挡角色
Overlap(重叠) 比如:芦苇丛和角色重叠,敌人无法看见玩家
lgnore(忽略)
1.分别配置A和B的对象类型(Object Type)
2.分别配置A和B的碰撞响应结果(Collision Response)
3.分别配置A和B的启用碰撞设置(Collision Enabled)
A对B的碰撞响应结果 + B对A的碰撞响应结果 = 最终的碰撞结果
对象类型(Object Type)
也就是当前的对象类型,worldstatic等等,也可以自定义(项目设置->引擎->碰撞(Collision))
碰撞响应结果(Collision Response)
碰撞响应是对两种检测响应(射线)和物体响应,进行配置Block(阻挡)、Overlap(重叠)和lgnore(忽略)
碰撞设置(Collision Enabled)
No Collision(无碰撞)- 不参与任何碰撞
Query Only(仅查询)- 只响应射线/形状追踪
Physics Only(仅物理)- 只响应物理模拟
Query and Physics(查询和物理)- 两者都响应
启动OnHit和OnOverlap事件
二、OnHit和OnOverlap事件触发方法
在项目开发过程中,总会碰到两个物体,比如静态网格体、胶囊体进行碰撞事件,但有时需求不同(比如不能开启物理模拟),触发OnHit和OnOverlap事件方法主要有四种:
1.通过开启物理模拟
1)碰撞启用Collision Enabled并配置,如第一部分所述
2)两个物体之间有一方开启物理模拟
2.通过射线/形状追踪检测碰撞
1)碰撞启用Collision Enabled并配置,如第一部分所述
2)射线追踪(Line Trace)、形状追踪(Shape Trace)
3.附加到移动组件上
这种方法是直接复用现有移动系统,比如ACharacter类,有CapsuleComponent和CharacterMovementComponent组件,就有默认的碰撞设置及移动碰撞机制(Sweep)
4.通过代码移动时启用Sweep
Sweep(扫掠),Sweep是一种带形状的连续碰撞检测(CCD),它是将一个几何体(Sphere/Capsule/Box)沿着路径“扫”过去。
1)碰撞启用Collision Enabled并配置,如第一部分所述
2)蓝图或代码是开启Sweep
Sweep是UE中实现“精确移动+碰撞响应”的黄金标准,无论是飞行器、子弹、传送、还是自定义角色,都应优先考虑Sweep而非依赖物理模拟。
5.必要前置
1) 碰撞启用并配置
2) 生成Hit事件或overlap事件
3) 对象可移动性
6.cesium的flyto碰撞问题
问题:cesium插件中有flyto的方法,但它不能触发hit事件能触发overlap事件
问题原因没有找到,以下只是猜测:
FlyTo使用插值移动相机/Actor,Cesium Globe,Anchor转换地理坐标→UE坐标,坐标转换可能导致Sweep检测精度问题,也就是FlyTo后Actor的状态可能影响后续SetActorLocation的Sweep行为。
7.Set Actor Relative Rotation和Set Relative Rotation (Component)区别
| 特性 | SetActorRelativeRotation | SetRelativeRotation (Component) |
|---|---|---|
| 操作对象 | Actor | 单个组件 |
| Sweep检测范围 | 仅RootComponent | 该组件 |
| Hit事件触发 | 仅RootComponent | 该组件 |
| 依赖RootComponent | 是 | 否 |
| 性能开销 | 较高 | 较低 |
| 代码简洁性 | 更简洁 | 稍复杂 |
| 控制精度 | 低 | 高 |
| 推荐使用 | 简单Actor | 复杂Actor |
所以在使用Set Actor Relative Rotation时,只要组件中只要有一个组件开启Sweep检测,就可执行actor的hit或overlap事件,且多个组件开启Sweep也只执行一次hit或overlap事件。










