1.1 碰撞通道(Collision Channel)与碰撞响应(Collision Response)
★★ 中等考点: Collision Channel、Object Type、Collision Response(Block/Overlap/Ignore)、碰撞预设
参考答案:
- 通道分两类:
- Object Channel(对象通道):定义物体"是什么",每个物理体只能有一个;默认为 WorldStatic、WorldDynamic、Pawn、PhysicsBody、Vehicle、Destructible。
- Trace Channel(检测通道):定义检测的类型(射线/Sweep),不属于物体本身;默认为 Visibility、Camera。
- 三种响应的行为:
- Block:物理引擎阻止穿透,触发
OnComponentHit,产生反作用力; - Overlap:不阻止穿透,触发
OnComponentBeginOverlap/EndOverlap,不产生物理力; - Ignore:完全无交互,不做碰撞检测。
- 响应矩阵:Block×Block=物理碰撞;Block×Overlap=Block 方阻挡并触发 Overlap 事件;Overlap×Overlap=双向 Overlap;任一方 Ignore 即无交互。
- Block:物理引擎阻止穿透,触发
- C++ 设置碰撞响应:
Mesh->SetCollisionObjectType(ECC_Pawn);
Mesh->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block);
Mesh->SetCollisionResponseToAllChannels(ECR_Block);
Mesh->SetCollisionResponseToChannel(ECC_Visibility, ECR_Ignore);
Mesh->SetCollisionProfileName(FName("PhysicsActor")); // 推荐使用预设- 自定义通道:Project Settings → Collision → New Object/Trace Channel;或在 DefaultEngine.ini 中配置:
[/Script/Engine.CollisionProfile]
+DefaultChannelResponses=(Channel=ECC_GameTraceChannel1,DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False,Name="Projectile")#define ECC_Projectile ECC_GameTraceChannel1- 碰撞预设(Collision Profile)= Object Type + 一组响应规则打包(如 "Pawn"、"PhysicsActor"、"NoCollision")。
- 事件触发条件:响应不都为 Ignore;至少一方开启
GenerateOverlapEvents/bNotifyRigidBodyCollision(Hit 事件);Overlap 至少一方响应为 Overlap,Hit 至少一方为 Block。 - 易错点:把 Overlap 当 Hit 用、忘记开启 Generate Overlap Events;过多 Overlap 检测有性能开销。