一、先说说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)区别

特性SetActorRelativeRotationSetRelativeRotation (Component)
操作对象Actor单个组件
Sweep检测范围仅RootComponent该组件
Hit事件触发仅RootComponent该组件
依赖RootComponent
性能开销较高较低
代码简洁性更简洁稍复杂
控制精度
推荐使用简单Actor复杂Actor

所以在使用Set Actor Relative Rotation时,只要组件中只要有一个组件开启Sweep检测,就可执行actor的hit或overlap事件,且多个组件开启Sweep也只执行一次hit或overlap事件。