UE4中的简单碰撞与复杂碰撞

       物体碰撞形状分为简单碰撞和复杂碰撞,简单碰撞的形状比较简单,方便计算,可以由用户自己添加和编辑,复杂碰撞紧贴物体表面,形状精确但是计算量大。
       将引擎下的球体模型复制到工程的Content目录下,双击在模型编辑器中观察简单碰撞(不太明显)和复杂碰撞,使用工具栏Collision下拉菜单切换碰撞的显示与隐藏,如下图所示
UE4中的简单碰撞与复杂碰撞

UE4中的简单碰撞与复杂碰撞
       为了在碰撞检测测试中更明显看到简单碰撞和复杂碰撞的区别,将球体的简单碰撞删除并添加一个简单的盒子碰撞
UE4中的简单碰撞与复杂碰撞
       添加完成后,同时显示简单碰撞和复杂碰撞,如下图
UE4中的简单碰撞与复杂碰撞
       接下来观察两种碰撞形状对鼠标点击物体检测的影响,将球体拖入关卡中,并将它的移动属性改为可移动(Movable),在关卡蓝图中添加如下代码(需将鼠标设置为显示状态)
UE4中的简单碰撞与复杂碰撞
       这里在鼠标左键按下时通过GetHitResultUnderCursorForObjects函数检测鼠标下的物体(物体类型为WorldDynamic确保不会检测到地面,而只会检测到球体),然后在点击点画一个红点。
        除了GetHitResultUnderCursorForObjects还可以使用更通用的LineTraceForObjects,LineTraceForObjects可以添加忽略的Actor,从而过滤一些物体
UE4中的简单碰撞与复杂碰撞
      经过多次点击后可以看到下面的效果
UE4中的简单碰撞与复杂碰撞

UE4中的简单碰撞与复杂碰撞
       可以看到TraceComplex为false时检测的是物体的简单碰撞,即使没有点击到球体本身检测到的也是球体。将TraceComplex设置为true,则只在点击到球体上时才会被检测到。
UE4中的简单碰撞与复杂碰撞
       简单碰撞形状简单计算效率高所以很多地方都检测简单碰撞,比如角色行走时检测与物体的碰撞,将上面球体的简单碰撞盒子放大,如下图
UE4中的简单碰撞与复杂碰撞
       在BeginPlay事件中绑定球体的撞击事件
UE4中的简单碰撞与复杂碰撞
       当角色走到球体的简单碰撞盒边缘的时候就走不动了,还触发OnActorHit事件
UE4中的简单碰撞与复杂碰撞
       此外物理仿真(SimulatePhysics)以及寻路(AIMoveTo)也是检测简单碰撞。
       那么如何才能使简单碰撞的形状也跟复杂碰撞一样紧贴物体表面呢?除了在模型编辑器中添加形状并编辑外,更简单的方法是将CollisionComplexity设置为UseComplexCollisionAsSimple将复杂碰撞的形状作为简单碰撞的形状。
UE4中的简单碰撞与复杂碰撞
       这个设置项有一个限制就是这个物体本身不能使用物理仿真,但是它能做为非仿真体与其他的仿真物体产生碰撞,具体说明见下图
UE4中的简单碰撞与复杂碰撞
       关于碰撞的更多信息参考:
https://docs.unrealengine.com/en-US/Engine/Physics/SimpleVsComplex/index.html
https://docs.unrealengine.com/en-US/Engine/Physics/Collision/Reference/index.html
https://www.unrealengine.com/en-US/blog/collision-filtering