解决Unity物体速度过快无法进行碰撞检测(碰撞检测穿透)

article/2025/11/11 2:37:58

一、解决碰撞检测穿透方法一

首先我们知道只要是跟碰撞相关的基本都是离不开刚体 Rigidbody这个组件,刚体中有一个参数适用于检测碰撞的 如下图
在这里插入图片描述

Collision Detection就是碰撞检测。

然而有时候开发游戏,对于高速运动的物体(比如:子弹/大炮,或者很高处自由落体的物体),即使再三确认加了Rigidbody组件,检查了碰撞检测的代码完全没有错误,但仍然会出现 物体直接穿过另一个物体 的问题, 则说明这个碰撞检测的程序对于高速运动的物体而言会出错。

Unity2017物体的Rigidbody组件提供了一个Collision Detection的属性,该属性用于更改物体的碰撞检测模式————一共有三种模式可以选择(选择你想要的模式,底层碰撞检测的算法均有差别)在这里插入图片描述
(解释一下,上图每个箭头两端均指的是两个即将碰撞的物体的Collision Detection属性的值,箭头中间的属性值所指的是这两个物体时间碰撞所用的碰撞检测模式)

Discrete(离散型检测模式)就是普通的默认状态;
Continuous(连续检测)则是更加精细的碰撞检测,但是很耗资源;在这种状态下,当这个刚体与其他普通刚体碰撞时,仍将使用Discrete的碰撞检测,但是与没有刚体的Mesh Collider碰撞时就会连续检测了。
Continuous dynamic(动态连续检测)则是对没有刚体的Mesh Collider或是对处在Continuous或是Continuous Dynamic状态下的刚体使用连续碰撞检测,对其他的刚体使用普通的Discrete检测。
但是!!!必须得注意的是:

1.Continuous/Continuous dynamic(连续检测)–对物理性能有很大的影响,所以如果高速运动的物体的碰撞没有问题,应该设置为默认的 Discrete

2.Continuous/Continuous dynamic – 只支持使用Box,Sphere和Capusle碰撞器的刚体。(这一点是在以往网上的资料上发现的,查了Unity2017最新版手册,发现确实有说到Continuous支持Box,Sphere和Capusle)

2018之后又出了一个Continuous Speculative 这里官方的API解释是要比Continuous和Dynamic的方式这两种方式更加的节省性能,是扫描方式的进行连续碰撞检测。(猜测:才物体静止的时候不进行检测节省性能。在有位移的时候才进行连续碰撞检测)

总结:

Discrete适用于大部分刚体

Continuous适用于将有可能会被高速移动物体撞上的物体

Continuous Dynamic适用于高速移动的物体

使用连续碰撞检测(Continuous和Continuous Dynamic)前提:
刚体和刚体: 刚体的碰撞器必须是Box,Sphere,Capusle.
刚体和非刚体(静态碰撞器): 刚体物体的碰撞器必须是Box,Sphere,Capusle,非刚体物体的碰撞器必须是Mesh。

二、解决碰撞检测穿透方法二

不使用刚体 Rigidbody的方式,采用发射子弹之前,先发射射线,记录碰撞点(判断是否会发生碰撞),然后在发射子弹。

void Update () 
{Vector3 oriPos = transform.position;//记录原来的位置transform.Translate (Vector3.forward * speed * Time.deltaTime); //移动float length = (transform.position - oriPos).magnitude;//射线的长度Vector3 direction = transform.position - oriPos;//方向RaycastHit hitinfo;bool isCollider = Physics.Raycast (oriPos, direction,out hitinfo,length);//在两个位置之间发起一条射线,然后通过这条射线去检测有没有发生碰撞if(isCollider){....}
}

http://chatgpt.dhexx.cn/article/lqrwfIqG.shtml

相关文章

【Unity】Unity中获得碰撞体碰撞的位置

有时间的直接看sprite slicer这个插件的代码,原理也是发射线检测,代码逻辑什么的比下面的文章来的好的多,如果有空我也可以整理一下。 在纯物理环境中,为了获得碰撞体碰撞的位置,我们可以使用Collider2D.OnCollisionE…

Unity 3D中的射线与碰撞检测

在我们的游戏开发过程中,有一个很重要的工作就是进行碰撞检测。例如在射击游戏中子弹是否击中敌人,在RPG游戏中是否捡到装备等等。在进行碰撞检测时,我们最常用的工具就是射线,Unity 3D的物理引擎也为我们提供了射线类以及相关的函…

unity3D之简单的碰撞检测 .

版权声明:欢迎订阅公众号【5厘米的理想】,愿生命里的每一个小理想,都能成为生命里的小确幸。本文地址为: http://blog.csdn.net/qinyuanpei/article/details/23093665 大家好,欢迎大家关注由我为大家带来的Unity3D游戏…

Unity碰撞检测的必要条件

Unity中有两个独立的物理引擎,一个用于3D物理系统,一个用于2D物理系统。两个引擎是使用不同的组件实现的。因此BoxCollider和Rigidbody一起使用,代码中用OnTriggerEnter才能检测到触发;BoxCollider2D和Rigidbody2D一起使用,代码中…

Unity3D入门(二):碰撞检测

碰撞器由来 1.系统默认会给每个对象(GameObject)添加一个碰撞组件(ColliderComponent),一些背景对象则可以取消该组件。 2.在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。这两种方式的应用非…

Unity碰撞检测机制的原理(更新中...)

总是碰到关于碰撞的问题,今天实在忍不住了,来把它搞懂,不然听到八叉树,BSP什么的就怕可不行。 转自:http://www.manew.com/thread-102595-1-1.html 碰撞机制 最近做动态地形生成的时候,发现碰撞检测无效&…

Unity 3D之碰撞检测

一、碰撞器 碰撞检测两大必备条件&#xff1a;1.其中一方具备刚体&#xff0c;碰撞双方碰撞器 1、刚体 2、盒子碰撞器 3、碰撞检测方法 void Start(){this.gameObject.AddComponent<Rigidbody>();//添加刚体}void OnCollisionEnter(Collision other){if (other.gameOb…

Unity2d 学习笔记(四)碰撞检测

碰撞检测功能在游戏开发里是比较常用的&#xff0c;比如地图上无法穿越的部分&#xff0c;以及对于敌人的攻击判定等等。这篇博客就开简单介绍一下碰撞事件的处理。 参考视频&#xff1a;Unity碰撞检测_哔哩哔哩_bilibili 首先&#xff0c;我们需要为想要进行碰撞检测的对象添…

2022-04-20 Unity入门7——物理系统之碰撞检测

文章目录 一、刚体 Rigid Body二、碰撞器 Collider三、物理材质四、碰撞检测函数五、刚体加力 一、刚体 Rigid Body ​ 刚体利用体积&#xff08;碰撞器 Collider&#xff09;进行碰撞计算&#xff0c;模拟真实的碰撞效果&#xff0c;产生力的作用 ​ 碰撞产生的必要条件&…

Unity3D —— 碰撞检测

&#xff08;一&#xff09;两种碰撞检测方式 &#xff08;1&#xff09;Collider&#xff1a;碰撞器 ➜需要与刚体一起添加到游戏对象上才能触发碰撞&#xff0c;没有碰撞体的刚体会彼此相互穿过。 碰撞信息检测函数&#xff1a; //碰撞开始 void OnCollisionEnter(Collis…

【Unity入门】24.碰撞检测

【Unity入门】碰撞检测 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;碰撞体 &#xff08;1&#xff09;Collider组件 上节课我们有学习到&#xff0c;unity的物理系统提供了更方便的碰撞…

Unity3D教程:简单的碰撞检测

需求&#xff1a;当立方体Cube碰到地面Plane的时候&#xff0c;输出碰撞物体的名称&#xff0c;则表述检测到立方体碰撞了地面。 1.搭建一个简单的场景。 在新的工程中选择File->new Scene创建新的场景。然后在该场景中添加地板&#xff1a;GameObject->Create Other-&…

Unity学习笔记(二) 碰撞检测与触发检测

正好看到了Roll a ball这个游戏&#xff0c;于是就温故一下碰撞检测和触发检测 1.前期准备 中间省去建造一些基础的物体的过程&#xff0c;最后呈现如下图 我们的主角就是中间的球体 其GameObject名为player,我们在其身上添上刚体组件(Rigidbody)使其可以进行物理移动 …

Python实战——过采样数据的处理之改进的SMOTE算法

文章目录 1 理论2 实现3 补充3.1 原理介绍3.1.1 欠采样与过采样3.1.2 Tomek Link 法欠采样3.1.3 Random Over Sampling 随机过采样3.1.4 SMOTE 过采样3.1.5 综合采样 3.2 Python实战3.2.1 数据探索3.2.2 不同的抽样方法对训练集进行处理3.2.2.1 拆分自变量与因变量3.2.2.2 抽样…

机器学习中非平衡数据的处理 —— smote算法

目录&#xff1a;SMOTE算法 1、不平衡数据的背景知识2、SMOTE算法的理论思想3、SMOTE模块的使用 1、不平衡数据的背景知识 在实际应用中&#xff0c;分类问题中类别的因变量可能存在严重的偏倚&#xff0c;即类别之间的比例严重失调&#xff0c;如欺诈问题&#xff0c;欺诈类观…

Python:SMOTE算法

17.11.28更新一下&#xff1a;最近把这个算法集成到了数据预处理的python工程代码中了&#xff0c;不想看原理想直接用的&#xff0c;有简易版的python开发&#xff1a;特征工程代码模版 &#xff0c;进入页面后ctrlF搜smote就行&#xff0c;请自取 之前一直没有用过python&…

探索SMOTE算法

摘要 SMOTE是一种综合采样人工合成数据算法&#xff0c;用于解决数据类别不平衡问题(Imbalanced class problem)&#xff0c;以Over-sampling少数类和Under-sampling多数类结合的方式来合成数据。本文将以Nitesh V. Chawla&#xff08;2002&#xff09;的论文为蓝本&#xff0…

不均衡数据集采样1——SMOTE算法(过采样)

SMOTE: Synthetic Minority Over-sampling Technique 论文地址:https://www.jair.org/index.php/jair/article/download/10302/24590 SMOTE的算法思路是&#xff1a; 使用K近邻&#xff0c;在附近&#xff08;最少选附近5个点&#xff09;随便找一个同一类别的点&#xff0c;然…

数据不平衡问题——SMOTE算法赏析

春节前后好久没有总结问题了&#xff0c;这一段时间一直在做NLP的文本分类&#xff08;二分类&#xff09;问题&#xff0c;遇到了各种问题 。分别如下&#xff1a; 1、数据打标问题。运营人手不够可把兄弟们累坏了&#xff0c;是我给兄弟们分的任务&#xff0c;别打我嘿嘿。 …

SMOTE算法代码实现

类别不平衡问题 类别不平衡问题&#xff0c;顾名思义&#xff0c;即数据集中存在某一类样本&#xff0c;其数量远多于或远少于其他类样本&#xff0c;从而导致一些机器学习模型失效的问题。例如逻辑回归即不适合处理类别不平衡问题&#xff0c;例如逻辑回归在欺诈检测问题中&a…