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

2023-12-24 07:45

本文主要是介绍解决Unity物体速度过快无法进行碰撞检测(碰撞检测穿透),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

  • 一、解决碰撞检测穿透方法一
    • Collision Detection碰撞检测
    • 总结:
  • 二、解决碰撞检测穿透方法二

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

首先我们知道只要是跟碰撞相关的基本都是离不开刚体 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){....}
}

这篇关于解决Unity物体速度过快无法进行碰撞检测(碰撞检测穿透)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/531061

相关文章

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

maven异常Invalid bound statement(not found)的问题解决

《maven异常Invalidboundstatement(notfound)的问题解决》本文详细介绍了Maven项目中常见的Invalidboundstatement异常及其解决方案,文中通过... 目录Maven异常:Invalid bound statement (not found) 详解问题描述可

nacos服务无法注册到nacos服务中心问题及解决

《nacos服务无法注册到nacos服务中心问题及解决》本文详细描述了在Linux服务器上使用Tomcat启动Java程序时,服务无法注册到Nacos的排查过程,通过一系列排查步骤,发现问题出在Tom... 目录简介依赖异常情况排查断点调试原因解决NacosRegisterOnWar结果总结简介1、程序在

JAVA SpringBoot集成Jasypt进行加密、解密的详细过程

《JAVASpringBoot集成Jasypt进行加密、解密的详细过程》文章详细介绍了如何在SpringBoot项目中集成Jasypt进行加密和解密,包括Jasypt简介、如何添加依赖、配置加密密钥... 目录Java (SpringBoot) 集成 Jasypt 进行加密、解密 - 详细教程一、Jasyp

解决java.util.RandomAccessSubList cannot be cast to java.util.ArrayList错误的问题

《解决java.util.RandomAccessSubListcannotbecasttojava.util.ArrayList错误的问题》当你尝试将RandomAccessSubList... 目录Java.util.RandomAccessSubList cannot be cast to java.

java反序列化serialVersionUID不一致问题及解决

《java反序列化serialVersionUID不一致问题及解决》文章主要讨论了在Java中序列化和反序列化过程中遇到的问题,特别是当实体类的`serialVersionUID`发生变化或未设置时,... 目录前言一、序列化、反序列化二、解决方法总结前言serialVersionUID变化后,反序列化失

MySQL 5.7彻底卸载与重新安装保姆级教程(附常见问题解决)

《MySQL5.7彻底卸载与重新安装保姆级教程(附常见问题解决)》:本文主要介绍MySQL5.7彻底卸载与重新安装保姆级教程的相关资料,步骤包括停止服务、卸载程序、删除文件和注册表项、清理环境... 目录一、彻底卸载旧版本mysql(核心步骤)二、MySQL 5.7重新安装与配置三、常见问题解决总结废话不多

linux实现对.jar文件的配置文件进行修改

《linux实现对.jar文件的配置文件进行修改》文章讲述了如何使用Linux系统修改.jar文件的配置文件,包括进入文件夹、编辑文件、保存并退出编辑器,以及重新启动项目... 目录linux对.jar文件的配置文件进行修改第一步第二步 第三步第四步总结linux对.jar文件的配置文件进行修改第一步进

Go语言中如何进行数据库查询操作

《Go语言中如何进行数据库查询操作》在Go语言中,与数据库交互通常通过使用数据库驱动来实现,Go语言支持多种数据库,如MySQL、PostgreSQL、SQLite等,每种数据库都有其对应的官方或第三... 查询函数QueryRow和Query详细对比特性QueryRowQuery返回值数量1个:*sql

Python包管理工具pip警告WARNING: Ignoring invalid distribution问题解决

《Python包管理工具pip警告WARNING:Ignoringinvaliddistribution问题解决》pip警告通常是由于包安装不完整、损坏或拼写错误引起的,:本文主要介绍Pyt... 目录前言原因分析解决方法方法 1:手动删除无效元数据(推荐)方法 2:自动清理所有无效包验证修复总结 前言w