Unity-Rigidbody碰撞穿透
首先,说说碰撞的条件:1.rigidbody(刚体),一般用在主动移动的物体上,比如角色。2.collider,碰撞器,一般用于受力物体上,比如障碍块。
发生概率即触发方式:
1.刚体速度足够快,被撞物体的collider足够薄。
2.刚体速度在一定的v,被撞物体也在一定的速度v(被撞物体可移动)。
3.暂时未发现的其他情况。
在分析这两种(3种)情况之前,先了解下一个刚体(rigidbody)属性参数:Collision Detection(碰撞检测):
它有三种选项:Discrete(离散),Continuous(连续),Continuous Dynamic(动态连续),我们参考下官方的解释:
该属性用于控制避免高速运动的游戏对象穿过其他的对象而未发生碰撞,有三项可供选择
Discrete:离散碰撞器。该模式与场景中其他的所有碰撞体进行碰撞检测。该项为默认值。
Continuous:连续碰撞检测。该模式用于检测与动态碰撞体(带有Rididbody)的碰撞,使用连续碰撞检测模式来检测与网格碰撞体(不带ridigbody)碰撞。(添加一句原文翻译漏了),Rigidbody设置为连续动态碰撞检测模式将使用连续碰撞来检测。其他刚体会采用离散碰撞模式。此模式适用于那些需要与采用连续动态检测的对象相碰撞的对象。这对物理性能会有很大影响,如果不需要对快速运动对象进行碰撞检测,就使用离散碰撞检测模式。
Continuous Dynamic:连续动态碰撞检测模式,该模式用于检测与采用连续碰撞撞模式或连续
动态碰撞模式对象的碰撞,也可用于检测没有rigidbody的静态网格碰撞体。对于与之碰撞的其他对象可采用离散碰撞检测。动态连续碰撞检测模式也可用于检测快速运动的游戏物体。
翻译就是这样的理解并不难:后面两项就是为了用来能够检测到快速运动的物体不至于
你的void OnCollisionEnter(Collision hit)函数检测不到,而至于一个为Continuous Dynamic的刚体和一个Discrete的刚体碰撞,前者会使用使用Continous(连续)碰撞,后
者离散碰撞
再来总结下:当使用默认的离散式碰撞检测时,如果前一桢时对象在墙这一面,下一桢时对象已到到了墙另一面,那么碰撞检测算法将检测不到碰撞的发生,你可以将该对象的碰撞检测属性设置为Continuous,这时碰撞检测算法将会防止对象穿过所有的静态碰撞体,设置为Continuous Dynamic将还会防止穿过其他也设置为Continuous或者Continuous Dynamic的刚体。
这就很好理解,如果我们的主角在运动中碰到的都是静态collider,那么使用离散检测是可以满足的。如果我们在游戏中,主角将会碰撞到动态的collider,那么检测模式应该选择连续或者连续动态检测。这样可以很好的避免穿透现象。
然后,你以为这样就高枕勿忧了么?在实际的项目中,我们可能会发现,我们刚体上已经选择了连续检测甚至连续动态检测,依旧会有穿透问题,这就是我上面列举的两条(3条),被碰撞体的碰撞器太薄,被碰撞体的速度太快。这样依旧会导致穿透,那么原理是什么?我们知道unity中有fixedupdate,update这些更新方法,而这些更新中,都是有时间间隔更新的,更新的时候是用基础速度*时间,很有可能这个结果计算出来的时候车已经冲过了被碰撞体,就导致了我们的角色穿透,或者卡在被碰撞器的里面。
so,知道了这些,我们在项目中就知道如何规避这些“bug”了。
Unity-Rigidbody碰撞穿透的更多相关文章
- Unity触发碰撞
原文链接:Unity触发碰撞介绍 3D触发器与碰撞器 触发信息检测: 1.MonoBehaviour.OnTriggerEnter(Collider collider)当进入触发器 2.MonoBeh ...
- Unity -- Collider(碰撞器与触发器)
(2d与3d的Collider可以相互存在,但是无法相互协作,如2d是无法检测3d的,反之,一样) 在目前掌握的情况分析,在Unity中参与碰撞的物体分2大块:1.发起碰撞的物体.2.接收碰撞的物体. ...
- Unity UGUI鼠标穿透UI问题(Unity官方的解决方法)
简述 最近在用UGUI的时候遇到了鼠标穿透的问题,就是说在UGUI和3D场景混合的情况下,点击UI区域同时也会 触发3D中物体的鼠标事件.比如下图中 这里给Cube加了一个鼠标点击改变颜色的代码,如下 ...
- unity3d中 刚体(Rigidbody) 碰撞体(Collider) 触发器(Is Trigger)
刚体(Rigidbody)的官方(摘自Unity3d的官方指导书<Unity4.x从入门到精通>)解释如下: Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可 ...
- unity 2d碰撞/ui组件碰撞
首先,ugui的碰撞是可以用Collision2D跟Rigidbody2D实现的(就跟3D碰撞一样).之前试过不可以主要问题正在于Collision2D以及Rigidbody的设置上. 碰撞双方都添加 ...
- Unity Rigidbody 刚体中的Angular Drag和Freeze Position/Rotation
Rigidbody中 Angular Drag (角阻力):同样指的是空气阻力,只不过是用来阻碍物体旋转的.如果设置成无限的话,物体会立即停止旋转.如果设置成0,物体在上升过程中,会发生侧翻旋转. ...
- unity, 如果碰撞使用2d物理,为防止颤动,需将更新position的代码写在FixedUpdate里
例如我为主角添加了一个circle collider 2d,和一个rigidbody 2d,为障碍物添加了一个circle collider 2d. 然后我在主角的Update函数里更新位置让主角由A ...
- unity, 忽略碰撞
一,layer之间忽略碰撞. Edit->Project Settings->Physics->Layer Collision Matrix 二,collider之间忽略碰撞. vo ...
- unity, Rigidbody.constraints
一,同时施加多个限制: 用按位或(bitwise OR)实现,例如: GetComponent<Rigidbody>().constraints=RigidbodyConstraints. ...
随机推荐
- GCC编译器原理(一)------GCC 工具:addr2line、ar、as、c++filt和elfedit
1.3 GCC 工具 1.3.1 binutils 工具集 工具 描述 addr2line 给出一个可执行文件的内部地址,addr2line 使用文件中的调试信息将地址翻译成源代码文件名和行号. ar ...
- 快速学习 javascript
// js 6种数据类型:字符串.数值.布尔值.undefined.null.object // 三种非数字的数字类型:Infinity -Infinity NaN var str = "H ...
- solr window环境安装配置和管理页面基本使用
solr介绍 来自官网http://lucene.apache.org/solr/解释: Solr is highly reliable, scalable and fault tolerant, p ...
- 服务器管理员密码修改后SQL_Server_2008无法启动
服务器管理员administrator密码修改后SQL_Server_2008无法启动 其实很简单,我发现在网上找这个相关的问题,什么说法都有,把人绕的晕头转向的 我来教大家如何解决这个问题: 首先我 ...
- UOJ #276「清华集训2016」汽水
为什么你们常数都这么小啊 UOJ #276 题意:在树上找一条链使得|边权平均值$ -k$|尽量小,$ n<=5e4$ $ Solution:$ 首先二分答案$ ans$,即我们需要找一条链使得 ...
- Min_25筛学习笔记
感觉好好用啊 Luogu上的杜教筛模版题一发 Min_25抢到了 rank1 $ Updated \ on 11.29 $被 STO txc ORZ踩爆啦 前言 $ Min$_$25$筛可以求积性函数 ...
- 小玩意--自定义log记录
之前在帮TCL运维项目时,因某些原因,决定单就经销商相关业务中摒弃经典的log4j日志,改为每日自定义生成并写入相关日志,我遂写了一个util,代码如下:p.s.实现的思路很简单,仅为每次需要记录时, ...
- 代码编辑器 - Visual Studio Code
vscode的视图 1.Explorer 资源管理器 打开的编辑器:打开的正在编辑的文件,单击文件会覆盖前一个打开的文件tab,双击可使打开的文件并列显示 vue-server:你自己新建的项目目录, ...
- C# 并行循环
Parallel.For(); Paralle.ForEach() 异步编程模式
- 第一次发博,发个简单的Java程序发送手机短信验证
最近在准备一个项目,想的登录时候用手机验证,就通过上网查阅了一下手机验证的实现方法,原来超级简单,下面将一步一步介绍. 1.去中国网建注册一个账号密码,首次注册送五条免费短信和3条免费彩信.具体的网址 ...