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 Collision,那么即使在Actor对象开启了simulatePhysics(开启物理模拟)也不会有效,也就不会受到重力而下落

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

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

UE4碰撞规则详解的更多相关文章

  1. Nginx 常用全局变量 及Rewrite规则详解

    每次都很容易忘记Nginx的变量,下面列出来了一些常用 $remote_addr //获取客户端ip $binary_remote_addr //客户端ip(二进制) $remote_port //客 ...

  2. 53个Oracle语句优化规则详解(转)

    Oracle sql 性能优化调整  1. 选用适合的ORACLE优化器        ORACLE的优化器共有3种:a. RULE (基于规则)   b. COST (基于成本) c. CHOOSE ...

  3. ESLint 规则详解(二)

    接上篇 ESLint 规则详解(一) 前端界大神 Nicholas C. Zakas 在 2013 年开发的 ESLint,极大地方便了大家对 Javascript 代码进行代码规范检查.这个工具包含 ...

  4. QuantLib 金融计算——基本组件之天数计算规则详解

    目录 天数计算规则详解 定义 30 / 360 法 30/360 US 30/360 Bond Basis 30E/360 30E/360 ISDA Actual 法 Actual/Actual IC ...

  5. Apache Rewrite 规则详解

    在开篇之前: 我想说这篇文章其实是我刚刚接触Rewrite的时候学习的文档,应属转载,但是在这里我不想写明原地址,原因是文章中大多数给出的配置命令经实验都是错误的.需要原文的可以在谷歌上搜索一下&qu ...

  6. css样式继承规则详解

    css样式继承规则详解 一.总结 一句话总结:继承而发生样式冲突时,最近祖先获胜(最近原则). 1.继承中哪些样式不会被继承? 多数边框类属性,比如象Padding(补白),Margin(边界),背景 ...

  7. eslint规则详解

    { // 环境定义了预定义的全局变量. "env": { //环境定义了预定义的全局变量.更多在官网查看 "browser":true, "node& ...

  8. Nginx之location 匹配规则详解

    有些童鞋的误区 1. location 的匹配顺序是“先匹配正则,再匹配普通”. 矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”.我这么说,大家一定会反驳我,因为按“先匹配普通, ...

  9. jQuery.validator 验证规则详解

    前言:jQuery.validator是一款非常不错的表单验证插件,验证方式非常简单方便,它还对HTML5做了兼容处理,了解了验证规则,就基本掌握了它的使用,下面就让我一一道来 jQuery.vali ...

随机推荐

  1. python中defaultdict方法的使用

    默认值可以很方便 众所周知,在Python中如果访问字典中不存在的键,会引发KeyError异常(JavaScript中如果对象中不存在某个属性,则返回undefined).但是有时候,字典中的每个键 ...

  2. Python-基本文件处理

    目录 文件的类型 什么是文件? 文件的分类 文件的打开与关闭 文件处理的三个步骤 使用方式 爬虫 requests库的使用 文件的类型 什么是文件? 一堆.py/.txt 存储着文字信息文件, 文件的 ...

  3. RN 开发工具及发布release版本

    2.1.开发工具推荐visual studio code https://code.visualstudio.com/docs/?dv=win 选择安装react native tool 就可以了 2 ...

  4. Django项目:CMDB(服务器硬件资产自动采集系统)--10--06CMDB测试Linux系统采集硬件数据的命令05

    cd /py/AutoClient/bin python3 auto-client.py /usr/local/python3/bin/pip install requests python3 aut ...

  5. 深入浅出 Java Concurrency (7): 锁机制 part 2 AQS[转]

    在理解J.U.C原理以及锁机制之前,我们来介绍J.U.C框架最核心也是最复杂的一个基础类:java.util.concurrent.locks.AbstractQueuedSynchronizer. ...

  6. Shell 语法之用户输入

    bash shell 提供了一些不同的方法从用户处获取数据,这些方法包括命令行参数.命令行选项和直接读取键盘输入. 命令行参数 bash shell 将在命令行中输入的所有参数赋值给一些特殊变量,称为 ...

  7. c++ stream操作杂记

    包含简单的读写文件,供初学者入门,stream目前包含三种,终端,文件,内存,注意宽字节. ) ; ) ; ] ; } pasting

  8. MUI使用vue示例

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  9. cookie - 提示上一次访问该网页的时间

          案例:记住上一次访问时间         1. 需求:             1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问.             2. ...

  10. docker tomcat启动慢

    镜像 https://hub.docker.com/r/errorlife/tomcat/ docker pull errorlife/tomcat