当前位置: 首页 > news >正文

Unity核心概念⑫:碰撞检测

碰撞产生的必要条件,两个物体都有碰撞器,至少一个物体有刚体。

一、刚体

让一个物体可以模拟产生力的效果

1.RigidBody组件信息

①Mass

质量,默认单位为Kg,质量越大惯性越大。

②Drag

空气阻力,根据力移动对象时影响对象的空气阻力大小。

③Use Gravity

是否受重力影响。

④Angular Drag

根据扭矩旋转对象时影响对象的空气阻力大小。0表示空气没有阻力。

⑤Is Kinematic

如果启用此选项,则对象不会被物理引擎驱动,只能通过Transform对其进行操作。对于移动平台,或者如果要动画化附加了HingeJoint的刚体,此属性将非常有用。

⑥Interpolate

插值运算,让刚体物体移动更平滑。

None不应用插值运算,Interpolate根据前一帧的变化来平滑变换。

Extrapolate,差值运算,根据下一帧的估计变换来平滑变换。

⑦Collision Detection

碰撞检测模式,用于防止快速移动的对象穿过其他对象而不检测碰撞。

Ⅰ、Discrete(离散检测)

对场景中的所有其他碰撞体使用离散碰撞检测。其他碰撞体在测试碰撞时会使用离散碰撞检测。用于正常碰撞(这是默认值)

Ⅱ、Continuous(连续检测)

对动态碰撞体(具有刚体)使用离散碰撞检测
并对静态碰撞体(没有刚体)使用连续碰撞检测。
设置为连续动态(Continuous Dynamic)的刚体将在测试与该刚体的碰撞时使用连续碰撞检测。(此属性为物理性能有很大影响,如果没有快速对象的碰撞问题,请将其保留为 Discrete 设置)
其他刚体将使用离散碰撞检测。

Ⅲ、Continuous Dynamic(连续动态检测)

性能消耗高。对设定为连续(Continuous)和连续动态(Continuous Dynamic)碰撞的测试对象使用连续碰撞检测。这种静态碰撞体(没有刚体)使用连续碰撞检测。
对于所有其他碰撞体,使用离散碰撞检测。用于快速移动的对象。

Ⅳ、Continuous Speculative(连续推测检测)

对刚体和碰撞体使用推测性连续碰撞检测。该方法通常比连续碰撞检测的成本更低。

⑧Constraints

约束,对刚体运动的限制。

Freeze Position,有选择地停止刚体沿世界X、Y、Z轴的移动。

Freeze Rotation,有选择地停止刚体围绕局部X、Y、Z轴的旋转。

二、碰撞器

1. 3D碰撞器种类

①盒状 ②球状 ③胶囊 ④网格 ⑤轮胎 ⑥地形

2.共同参数

①Is Triger

是否是触发器。如果启用此属性,则该碰撞体将用于触发事件,并被物理引擎忽略。主要用于进行没有物理效果的碰撞检测。

②Material

物理材质。可以确定碰撞体和其它对象碰撞时的交互(表现)方式。

③Center

碰撞体在对象局部空间中的中心点位置。

3.常用碰撞器

①盒状碰撞器(Box Collider)

Size:碰撞体在X、Y、Z方向上的大小。

②球状碰撞器(Sphere Collider)

Radius:球形碰撞体的半径大小。

③胶囊碰撞器(Capsule Collider)

Radius:胶囊体的半径。

Height:胶囊体的高度。

Direction:胶囊体在对象局部空间中的轴向。

4.异形物体使用多种碰撞器组合

刚体对象的子对象碰撞器信息参与碰撞检测。

5.不常用碰撞器

①网格碰撞器(Mesh Collider)

勾选此复选框可启用 Convex。如果启用此属性,该 Mesh Collider 将与其他 Mesh Collider 发生碰撞。Convex Mesh Collider 最多 255 个三角形。

Cooking Options:启用或禁用影响物理引擎对网格处理方式的网格控制选项。

Ⅰ、None
禁用下方列出的所有 Cooking Options。

Ⅱ、Everything
启用下方列出的所有 Cooking Options。

Ⅲ、Cook for Faster Simulation
使物理引擎复制网格以加快模拟速度。启用此设置后,这会运行一些额外步骤,以保证生成的网格对于运行时性能是最佳的。这会影响物理查询和接触生成的性能。禁用此设置后,物理引擎会使用更快的控制速度,并尽可能快速生成结果。因此,烹制的 Mesh Collider 可能不是最佳的。

Ⅳ、Enable Mesh Cleaning
使物理引擎清理网格。启用此设置后,烹制过程会尝试消除网格的退化三角形以及其他几何瑕疵。此过程生成的网格更适合于在碰撞检测中使用,往往可生成更准确的击中点。

Ⅴ、Weld Colocated Vertices
使物理引擎在网格中删除等效的顶点。启用此设置后,物理引擎将会具有相同位置的顶点。这对于运行时发生的碰撞反馈十分重要。

②Wheel Collider

Ⅰ、Mass

车轮的质量。

Ⅱ、Radius

车轮的半径。

Ⅲ、Suspension Distance

车轮悬架的最大延伸距离(在局部空间中测量)。悬架始终向下延伸穿过局部Y轴。

Ⅳ、Force App Point Distance

此参数定义车轮上的受力点,此距离应该是距车轮底部静止位置的距离(沿悬架行程方向),以米为单位。当forceAppPointDistance=0时,受力点位于静止的车轮底部。较好的车辆会使受力点略低于车辆质心。

Ⅴ、Suspension Spring

悬架尝试通过增加弹簧力和阻尼力来到达目标位置(Target Position)。

Ⅵ、Forward Friction

车轮向前滚动时轮胎摩擦的特性。

Ⅶ、Sideways Friction

车轮侧向滚动时轮胎摩擦的特性。

Ⅷ、注意

不必通过转动或滚动WheelCollider对象来控制汽车;附加了WheelCollider的对象应始终相对于汽车本身固定

③Terrain Collider

Terrain Data:地形数据。

Enable Tree Colliders:选中此属性时,将启用树碰撞体。

三、物理材质

物理材质参数

1.Dynamic Friction

已在移动时使用的摩擦力,通常为0到1之间的值。值为零就像冰一样,值为1将使对象迅速静止(除非用很大的力或重力推动对象)。

2.Static Friction

当对象静止在表面上时使用的摩擦力,通常为0到1之间的值。值为零就像冰一样,值为1将导致很难让对象移动。

3.Bounciness

表面的弹性如何?值为0将不会反弹。值为1将在反弹时不产生任何能量损失,预计会有一些近似值,但可能只会给模拟增加少量能量。

4.Friction Combine

两个碰撞对象的摩擦力的组合方式。

Average

对两个摩擦值求平均值。

②Minimum

使用两个值中的最小值。

③Maximum

使用两个值中的最大值。

④Multiply

两个摩擦值相乘。

5.unce Combine

两个碰撞对象的弹性的组合方式。其模式与Friction Combine模式相同。

四、碰撞检测函数

注意:碰撞和触发响应函数属于特殊的生命周期函数,也是通过反射调用。

1.碰撞检测响应函数

Collision类型的参数包含了碰到自己的对象的相关信息。

只要得到了碰撞到的对象的任意一个信息,就可以得到它的所有信息。

关键参数:

Ⅰ、碰撞到的对象碰撞器的信息(collision.collider)

Ⅱ、碰撞对象的依附对象(collision.gameObject)

Ⅲ、碰撞对象的依附对象的位置相关信息(collision.transform)

Ⅳ、触碰点数相关(collision.contacts)

①碰撞触发接触时会自动执行的函数

private void OnCollisionEnter(Collision collision)
{}

②碰撞结束分离时会自动执行的函数

private void OnCollisionExit(Collision collision)
{}

③两个物体相互接触摩擦时会不停调用的函数

private void OnCollisionStay(Collision collision)
{}

五、触发器检测响应函数

1.触发开始的函数,当第一次接触时,会自动调用

private void OnTriggerEnter (Collider other)
{}

2.离开触发区域时调用

private void OnTriggerExit(Collider other)
{}

3.停留在触发区域内时,每帧调用

private void OnTriggerStay(Collider other)
{}

六、明确什么时候会响应函数

1.只要挂载的对象能和别的物体产生碰撞或者触发,那么以上6个函数就能够被响应

2.以上6个函数一般根据需求来进行选择。

3.如果是一个异形物体,刚体在父对象上。假如想通过子对象上挂脚本检测碰撞是不行的,必须挂载到这个刚体父对象上才行。

4.明确物理碰撞和触发器响应的区别。                                                                                             

5.碰撞和触发器函数都可以写成虚函数,在子类去重写逻辑。一般会把想要重写的碰撞和触发函数 写成保护类型的,没有必要写成public类型,因为不需要自己手动调用,unity会通过反射帮助我们自动调用。

七、刚体加力

给刚体加力的目标就是让其有一个速度,朝向某一个方向移动。

1.首先获取刚体组件

rigidBody = this.GetComponent<rigidBody>();

2.添加力

施加力过后,对象是否停止移动,是由阻力决定的。如果阻力为0,施加力过后,物体始终不会停止运动。

①相对世界坐标系施加力

rigidBody.AddForce(Vector3.forward * 10);//z轴正方向施加一个力

在世界坐标系中让对象相对于自己面朝向移动

rigidBody.AddForce(this.transform.forward * 10);

②相对本地坐标系施加力

rigidBody.AddRelativeForce(Vector3.forward * 10);

3.添加扭矩力,使其旋转

①相对世界坐标系

rigidBody.AddTorque(Vector3.up * 10);

②相对本地坐标系

rigidBody.AddRelativeTorque(Vector3.up * 10);

4.直接改变速度

rigidBody.velocity = Vector3.forward * 10;

5.模拟爆炸效果

// 给刚体添加一个模拟爆炸效果的力
rigidBody.AddExplosionForce(10, Vector3.zero, 10);

6.力的几种模式

力的模式主要就是计算方式不同,由于计算方式不同,最终的移动速度就会不同。

// ForceMode.Force - 受质量影响(默认)
rigidBody.AddForce(Vector3.forward * 10, ForceMode.Force); // 10牛顿力// ForceMode.Acceleration - 忽略质量(当前模式)
rigidBody.AddForce(Vector3.forward * 10, ForceMode.Acceleration); // 10m/s²加速度// ForceMode.Impulse - 瞬间冲量(受质量影响)
rigidBody.AddForce(Vector3.forward * 10, ForceMode.Impulse); // 瞬间10牛·秒// ForceMode.VelocityChange - 瞬间速度变化(忽略质量)
rigidBody.AddForce(Vector3.forward * 10, ForceMode.VelocityChange); // 瞬间10m/s

7.力场脚本

力场脚本并不是一个官方的特定组件,而是一个通用的设计概念。它指的是通过编写代码,在特定区域内,对进入该区域的物体施加物理力,从而模拟各种力场效果(如磁力、风力、引力、斥力等)。

其核心原理是:检测区域内的物体 → 计算力的方向和大小 → 施加力。

8.刚体的休眠状态

休眠状态是物理引擎的一种内部优化机制。当一个刚体的运动和旋转几乎停止(速度低于某个阈值)且不受任何外力影响时,物理引擎会将其标记为 “休眠”。目的是为了节省性能,因为物理计算非常消耗 CPU 资源,休眠机制让物理引擎可以忽略这些静止的物体,从而将宝贵的计算资源集中处理那些真正在运动的物体。

// 检查刚体是否处于休眠状态
if(rigidBody.IsSleeping())
{// 如果刚体正在休眠,则强制唤醒它// 唤醒后,物理引擎将重新开始计算该刚体的运动和碰撞rigidBody.WakeUp();
}

http://www.dtcms.com/a/393113.html

相关文章:

  • 【读论文】面向工业的ASR语音大模型
  • 重谈IO——五种IO模型及其分类
  • 数据库造神计划第十七天---索引(2)
  • 【开题答辩实录分享】以《车联网位置信息管理软件》为例进行答辩实录分享
  • (3)机器学习-模型介绍
  • 如何在 Ubuntu 20.04 LTS 上安装 MySQL 8
  • MuMu模拟器使用入门实践指南:从ADB连接到Frida动态分析
  • 条款5:优先选用auto, 而非显示类型声明
  • 强化学习原理(一)
  • 解读43页PPT经营分析与决策支持系统建设方案交流及解决经验
  • ubuntu24设置证书登录及问题排查
  • MySQL 备份与恢复完全指南:从理论到实战
  • 2011/12 JLPT听力原文 问题四
  • 实战free_s:在高并发缓存系统中落地“内存释放更安全——free_s函数深度解析与free全方位对比”
  • 异步通知实验
  • 用 C 语言模拟面向对象编程
  • 联邦学习论文分享:FedKTL
  • 智能体分类:从反应式到混合式的架构演进与实践
  • 【面板数据】上市公司企业ZF连接度数据集(1991-2024年)
  • 让codex像 cladue code一样 自动牛马
  • NeurIPS 2025 spotlight Autonomous Driving VLA World Model FSDrive
  • 多线程JUC
  • Qwen3技术之模型后训练
  • 服务端实现
  • 深入AQS源码:解密Condition的await与signal
  • ceph存储配置大全
  • 数据库造神计划第十六天---索引(1)
  • 【软件推荐】免费图片视频管理工具,让灵感库告别混乱
  • C语言入门教程 | 阶段二:循环语句详解(while、do...while、for)
  • GEO(Generative Engine Optimization)完全指南:从原理到实践