UE4碰撞规则详解(2016.7.12更新)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012999985/article/details/51290096

UE4的碰撞设置在官方的文档的 物理模拟模块(链接:点击打开链接)。但是操作起来感觉坑还是比较多,所以这里总结一下,以防平时经常会漏掉或忽略某些条件。如果想看关于碰撞响应触发,可以参考链接( UE4蓝图碰撞检测解析) 如果想进一步深入UE物理引擎相关内容,请参考博客 (UE4物理模块分析

 

 

现在开始讲解并总结一下UE4里面的碰撞规则:

 

1.只有拥有Collision属性的实体才可以碰撞

每个实体Actor,包括static Mesh,sphere,capsule等带碰撞的组件,在detail细节面板都有一个collision属性的栏。这个里面的参数是控制这些实体间进行碰撞的必要条件。

(注:在UE4里面,所有可以直接放在UE4场景世界里的对象都是一个Actor,这个类型在C++中是类AActor。其本身包含了非常多的属性,如坐标,碰撞等必要的特性。继承于Actor的有Pawn,Character,StaticMeshActor,CameraActor等等,所以在游戏世界存在的实体都属于Actor,不过Actor本身可能还包含组件等更多其他的元素)

 

2.不同实体的碰撞通过碰撞通道来区分

在UE4世界里面所有带碰撞的Actor被分为很多类别,比如WorldDynamic,Worldstatic,Pawn,character等,这些类型被称为一个个collision channel(碰撞对象通道)。一般来说,系统帮你设置了一些基本的collision channel。比如一个设置为静止的立方体归属于Worldstatic,而一个设置为可以动的球体归属于WorldDynamic。UE4做的非常的灵活的是,这个通道的类型,你可以任意的设置与添加,这样,你就可以根据你的情况自由的设置恰当的通道。更自由的是,你可以随时改变这个实体对象所属于的通道类型。

 

3.每一个实体必定有其自身属于的通道类型

每一个带有碰撞的Actor都有一个自己属于的通道类型,这个类型就在下图的Object Type里面。

 

4.每个实体可以通过碰撞预设来设置是否对其他通道类型实体产生碰撞

每一个带有碰撞的Actor都有一个Collision Presets(我们称他为碰撞预设),这个预设里面记录了他与系统设置里面所有通道类型之间的碰撞关系。参考下图,我们可以看到,这个实体本身的通道类型是WorldStatic,碰撞预设为BlockAll,意思就是与所有的实体都会产生碰撞。我们可以看到在下面有一个列表叫Collision Response,下面所有的对号都打在了Block里面,这就表示这个实体本身与所有打钩的对象都会产生碰撞。(你会看到还有一个trace response,之后再介绍)除了Block,还有Overlap和Ignore,分别是重叠和忽略。

 

5.碰撞时相互的,所以两个相互碰撞的实体设置都要满足碰撞条件

那是不是下图的这个实体就会和所有实体都会产生碰撞?不是的!我们知道力的作用是相互的,那这里的这个预设也是一个道理,另一个物体想与该实体碰撞,必须在这个物体所属的类型里面的Block打上对号才可以。这样二者就会相互碰撞了。

 

6.重叠事件也很重要,可以作为场景触发器事件

设置为Ignore和Overlap就不会产生任何碰撞,但是overlap会产生overlap事件(蓝图以及代码中可以判断实体之间是否有重叠,下面有简单解释)

 

7.trace response的理解

除了碰撞的通道,还有trace通道。trace也是一种碰撞检测的方法,向一个方向位置发射一个射线,对射线击中的对象进行判断,进而采取进一步措施。

所以trace response就是设置实体本身发射的trace会不会被其他对象响应。

 

8.正确设置staticMesh的碰撞盒类型(这是导致很多奇怪问题的重要bug)

每个staticMesh的碰撞盒必须正确对应他的StaticMeshSettings下的CollisionComplexity属性(双击静态网格物体文件即可进入编辑器)。这里简单介绍一下,每个静态网格实体都可以在编辑器里面添加碰撞盒,可以给物体设置简单的碰撞盒(球型,盒型,10个面的碰撞盒等),也可以设置复杂的碰撞盒。如果你给该静态物体设置简单的碰撞盒,StaticMeshSettings下的CollisionComplexity属性就应该设置为UseSimpleCollisionAsComplexity。如果设置了复杂的碰撞盒(AutoConvexCollision),这个属性就该为UseComplexityCollisionAsSimple(设置为Default也可以)。如果设置反了,就很容易出现无法正确模拟物理碰撞的情况。

 

9.最后,我们看一下图中的Collision Enabled类型。

正常4.8之前的版本有下面三个类型选项,文档基本说的比较通俗,不过有两点要注意

No Collision(无碰撞) - 不同该对象发生碰撞,无论是踪迹碰撞还是物理碰撞。
No Physics Collision(无物理碰撞) - 该刚体仅用于射线投射、扫射及重叠。
Collision Enabled(启用碰撞) - 该刚体用于物理模拟和碰撞查询。

   a.这个选项类似一个总开关,如果这个地方选择了No Collision,那么不管前面怎么设置通道,也不会产生任何碰撞事件

 

   b.这个里面No Physics Collision表示不进行物理模拟,就是说在这个实体移动时不会产生任何碰撞,但是各种重叠的事件还是会触发的。当这个实体静止的时候,与Collision Enabled的效果是完全一样的,可以碰撞也可以触发各种事件。

 

4.9之后变为下面的四个类型,如果你在官方文档找不到,切换成英文再查一下就能看到了。(中文文档总是更新的比较慢)

No Collision No collision is enabled for this body.
Query Only This body is used only for collision queries (raycasts, sweeps, and overlaps).
Physics Only This body is used only for physics collision.
Collision Enabled This body interacts with all collision (Query and Physics).

其实4.9之后把原来的No Physics Collision分成了Query Only 和 Physics Only,也就是说Query Only可以进行各种trace,sweep,Overlap事件的触发,但是不会进行物理模拟,简单的讲就是运动时不会产生任何碰撞。

Physics Only表示只能进行物理碰撞与运动模拟,但是不会触发任何事件。

旧版本的No Physics Collision与Query Only 基本相同,但是他在静止时是有碰撞的。

注意:如果这里设置为No Collision,那么即使在Actor对象开启了simulatePhysics(开启物理模拟)也不会有效,也就不会受到重力而下落

 

其他注意内容:对于每个StaticMesh类型的Actor(即存在于场景中的实体),他的的detail面板下StaticMesh栏下有一个BlockingVolum,功能是创建一个物理体积。所谓物理体积就是一个游戏不可见的但是真实存在的实体,可以用于触发事件等。BlockingVolum就是一个带碰撞盒的体积,点击这个按钮,就是给这个实体创建一个单独的碰撞盒体积。按住Alt+C可以隐藏或者显示碰撞盒。这个体积可以用于场景中用画刷刷出来没有碰撞盒的静态物体,但是也需要碰撞的物体。

原文链接(转载请标明):http://blog.csdn.net/u012999985/article/details/51290096

阅读更多

扫码向博主提问

Jerish_C

博客专家

非学,无以致疑;非问,无以广识
去开通我的Chat快问

没有更多推荐了,返回首页