Unity基础学习(十二)核心系统—物理系统之碰撞检测组件篇(1)刚体,碰撞体,材质
目录
RigidBody组件
1、什么是刚体?
2、刚体相关参数介绍
Mass
Drag
Angular Drag
Use Gravity 是否受重力影响 重力加速度影响(默认9.81m/s²)
Is Kinematic
Interpolation
Collision Detection
在进入今天的主题前,请务必记住这样一句话:
碰撞产生的必要条件,两个物体都有碰撞器,至少一个物体有刚体
现在不理解没事,我们后面会反复提及的
RigidBody组件
1、什么是刚体?
刚体(Rigidbody)是Unity物理系统的核心组件,赋予游戏对象真实的物理行为模拟能力。其本质是一个牛顿力学模拟器,通过计算物体的质量、速度、加速度、扭矩等物理量,驱动对象在虚拟世界中的运动。就相当于是你可以在一个虚拟世界模拟现实物理世界中的物理属性的基本组件,例如重力,弹力,摩擦力。Unity中的刚体分为2D和3D,带后缀的就是2D不带的就是3D,今天我们来看看3D,相信学会了3D,2D自然就明白了。
特征 | 3D刚体(Rigidbody) | 2D刚体(Rigidbody2D) |
---|---|---|
物理引擎 | PhysX(NVIDIA) | Box2D |
坐标系 | XYZ三轴运动 + 三维旋转 | XY平面运动 + Z轴旋转 |
适用场景 | 三维空间物理模拟 | 横版/俯视2D游戏 |
2、刚体相关参数介绍
Mass
质量(默认为千克)
质量越大惯性越大
Drag
空气阻力
根据力移动对象时影响对象的空气阻力大小
0 表示没有空气阻力 =5时类似水中运动
Angular Drag
根据扭矩旋转对象时影响对象的空气阻力大小。0 表示没有空气阻力。
啥意思呢?
Angular Drag是控制物体旋转衰减的核心物理参数。相较于线性阻力(Drag)作用于物体的平移运动,角阻力专门对旋转运动产生制动效果。它可以理解为"旋转摩擦力",单位时间内吸收物体角速度的能量,使其旋转逐渐停止。真实世界中类似油液阻尼器的效果
Use Gravity 是否受重力影响 重力加速度影响(默认9.81m/s²)
Is Kinematic
如果启用此选项,则对象将不会被物理引擎驱动,只能通过 (Transform) 对其进行操作。对于移动平台,或者如果要动画化附加了 HingeJoint 的刚体,此属性将非常有用。
Is Kinematic标志位决定刚体是否参与动力学计算,其物理表现与常规刚体存在本质差异。当勾选此选项时,物体将进入"逆向物理"模式——它会主动影响其他常规刚体,但其自身运动不再受物理引擎的力/碰撞驱动。就是看你物理学存不存在了,启用这个开关就会物理学不存在啦!
Interpolation
插值模式:插值运算 让刚体物体移动更平滑
None:基础物理模拟 不应用插值运算
Interpolate:平滑当前帧 根据前一帧的变换来平滑变换。缓存前两个物理帧的状态数据(位置/旋转)在渲染帧间使用线性插值(Lerp)或球面插值(Slerp)
Extrapolate:预测下一帧 根据下一帧的估计变换来平滑变换。 基于当前速度和加速度预测下一物理帧状态
为什么需要有插值计算呢,因为在帧更新中,如果你要到达一个地方,它管你怎么过去的,只要你过去了就行,不会考虑到你的体验感,可能会物理帧与渲染帧不同步,所以需要插值运算。
插值技术方案
在物理计算间隙插入平滑过渡:
记录物理引擎输出的原始位置/旋转数据
根据插值模式选择历史或预测数据
在渲染帧之间进行插值运算
指标 | None | Interpolate | Extrapolate |
---|---|---|---|
CPU消耗 | 最低 | 中等(+15%) | 最高(+30%) |
内存占用 | 0KB | 存储2帧数据 | 存储预测数据结构 |
运动平滑度 | 阶梯状 | 连续平滑 | 超平滑但可能抖动 |
延迟表现 | 无延迟 | 1帧延迟 | 负延迟(预测) |
适用速度范围 | <5 m/s | 5-30 m/s | >30 m/s |
Collision Detection
碰撞检测模式:用于防止快速移动的对象穿过其它对象而不检测碰撞。啥意思呢,意思就是说,你物体,运动的太快了,可以选择不同的模式检测碰撞,为什么呢,因为不是每个对象都需要非常高精度的碰撞检测,属于是区别对待了。这里简单介绍下背景:
离散时间步长导致的穿透
物理计算间隔:FixedUpdate默认0.02秒(50Hz)
高速物体问题:速度超过 物体尺寸 / fixedDeltaTime 时必然穿透
工作流程:
物理引擎计算本帧结束位置
生成从起点到终点的射线
仅检测终点处的碰撞
Discrete:默认离散检测 对场景中的所有其他碰撞体使用离散碰撞检测。其他碰撞体在测试碰撞时会使用离散碰撞检测。用于正常碰撞(这是默认值)
最大可检测速度 = (Collider大小) / fixedDeltaTime
Continuous:高速物体专用
对动态碰撞体(具有刚体)使用离散碰撞检测
并对静态碰撞体(没有刚体)使用连续碰撞检测。
设置为连续动态 (Continuous Dynamic) 的刚体将在测试与该刚体的碰撞时使用连续碰撞检测。(此属性对物理性能有很大影响,如果没有快速对象的碰撞问题,请将其保留为 Discrete 设置)
其他刚体将使用离散碰撞检测。工作原理:
计算运动轨迹参数方程
沿路径进行多段射线投射
找到首个碰撞点并修正位置
触发条件:
当前物体设为Continuous
碰撞对方至少为Discrete
数学原理:就是计算物体的运动轨迹最后达到的位置,然后判断
// 轨迹方程参数化
for (float t=0; t<=1; t+=0.1f) {Vector3 pos = startPos + velocity * t * fixedDeltaTime;if (CheckCollision(pos)) break;
}
Continuous Dynamic(双连续动态检测)性能消耗高
对设置为连续 (Continuous)和连续动态 (Continuous Dynamic)碰撞的游戏对象使用连续碰撞检测。还将对静态碰撞体(没有刚体)使用连续碰撞检测。
对于所有其他碰撞体,使用离散碰撞检测。这个检测只用于快速移动的对象。
原理:双方轨迹预测(双重CCD)
精确动量守恒计算
子步长自适应分割
Continuous Speculative(连续推测检测)
Continuous Speculative是Unity在物理引擎底层引入的一种优化型碰撞检测机制,其核心思想基于保守推进算法(Conservative Advancement)。与传统的连续碰撞检测(CCD)不同,该模式通过预测性边界扩展实现碰撞预判,对刚体和碰撞体使用推测性连续碰撞检测。该方法通常比连续碰撞检测的成本更低。
要求:
当前物体模式 | 对方物体模式 | 生效等级 |
---|---|---|
Continuous Dynamic | Continuous/Continuous Dynamic | 完全连续检测 |
Continuous Dynamic | Discrete | 降级为Continuous |
性能与精度关系
检测模式 | CPU耗时系数 | 内存消耗 | 适用速度范围 |
---|---|---|---|
Discrete | 1x | 16B | <25m/s |
Continuous | 3-5x | 64B | 25-100m/s |
Continuous Dynamic | 8-12x | 128B | >100m/s |
小结:
Constraints 约束 对刚体运动的限制
Freeze Position
有选择地停止刚体沿世界 X、Y 和 Z 轴的移动。
Freeze Rotation
有选择地停止刚体围绕局部 X、Y 和 Z 轴旋转。
简单来说,就是冻结某一个轴或者一个角度的运动
这个info就是组件的实际物理信息
这个是物体使用的材质,暂时不用管
总结:
参数名称 | 作用说明 | 选项/建议值 | 适用场景 | 注意事项 |
---|---|---|---|---|
Mass | 控制物体质量,影响惯性和碰撞动量 | 建议0.1-10(kg) | 需要真实碰撞效果时(如保龄球与木箱) | 质量差超过10倍会显著影响碰撞效果 |
Drag | 线性运动阻力,降低物体移动速度 | 0(真空)~5(水中) | 模拟不同介质中的运动(空气/水中) | 过高会导致物体难以移动 |
Angular Drag | 旋转运动阻力,抑制物体自转 | 0.05(光滑)~1(粘滞) | 稳定旋转物体(如陀螺)、制作旋转衰减效果 | 与质量成反比关系,轻物体衰减更快 |
Use Gravity | 是否受重力影响 | 布尔开关 | 需要自然下落时开启(如掉落物),飞行器/太空场景建议关闭 | 关闭后需手动控制垂直方向运动 |
Is Kinematic | 切换物理驱动模式 | 布尔开关 | 程序控制移动的平台、需要穿透的触发器 | 开启后仍可施加力但不会自动响应 |
Interpolation | 运动平滑算法 | None/Interpolate/Extrapolate | Interpolate:玩家角色;Extrapolate:高速抛射物 | Extrapolate可能产生位置预测误差 |
Collision Detection | 碰撞检测精度 | Discrete/Continuous/ContinuousDynamic | Continuous:中速物体(15-30m/s);ContinuousDynamic:超高速物体(>50m/s) | ContinuousDynamic消耗是Discrete的8-12倍 |
Constraints | 运动自由度限制 | Freeze Position/Rotation | 锁定Z轴用于2D游戏、限制特定方向运动 | 冻结旋转时仍可手动施加扭矩 |
Info | 实时物理状态显示 | 速度/角速度 | 调试物理行为时参考 | 仅显示信息不可编辑 |
Material | 物理材质引用 | PhysicMaterial | 调整摩擦/弹性系数时使用 | 需要配合Collider使用 |