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

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

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

首先我们知道只要是跟碰撞相关的基本都是离不开刚体 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的方式,采用发射子弹之前,先发射射线,记录碰撞点(判断是否会发生碰撞),然后在发射子弹。

csharp 复制代码
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)
		{
			....
		}
}
相关推荐
淡海水1 小时前
09-01-内存-Unity资源生命周期全景
unity·c#·游戏引擎·.netcore·gc
Solange__4 小时前
AI世界模型、3D场景生成和游戏引擎怎么选?按5类任务比较交互、物理与导出
开发语言·人工智能·游戏·平面·3d·自然语言处理·游戏引擎
LF男男5 小时前
Flower Defense—UIFacade
unity
呆呆敲代码的小Y5 小时前
【实战精选面试题】Unity精选面试题详细解答,按模块整理汇总
人工智能·游戏·unity·游戏引擎
小贺儿开发15 小时前
《流光绘忆》Unity 沉浸式光影互动
科技·unity·ai·程序员·工具·互动·光影
Aman198419 小时前
Claude Code做Unity项目移植(一):从零散工具到团队式
unity·游戏开发·vibe coding·claude code·项目迁移
地狱为王21 小时前
Unity使用VoxLock实现语音隔离
unity·游戏引擎·音频处理·voxlock
Jmyd01231 天前
博物馆数字展厅系统架构设计:实景采集到云渲染全链路
unity·系统架构·博物馆·数字展厅·博物馆数字化
解决小子1 天前
【虚幻引擎】【GAS】模块详解
游戏引擎·虚幻·gas
一只大鸽子1 天前
游戏开发笔记0-Godot启动
笔记·游戏引擎·godot