文章来源:
【唐老狮】Unity——物理系统(碰撞检测) - 哔哩哔哩 (bilibili.com)
发生碰撞、有物理效果、触发可穿透、不同阶段
一、碰撞检测
碰撞发生必要条件:2个都有碰撞器,1个有刚体
1.1 刚体组件
让物体有物理作用
刚体参数
Mass:对象的质量(默认为千克)
Drag:空气阻力
根据力移动对象时影响对象的空气阻力大小。0 表示没有空气阻力,无穷大使对象立即停止移动
Angular Drag:扭矩阻力
根据扭矩旋转对象时影响对象的空气阻力大小。0 表示没有空气阻力。请注意,如果直接将对象的 Angular Drag 属性设置为无穷大,无法使对象停止旋转。
Use Gravity:是否使用重力
Is Kinematic:
如果启用此选项,则对象将不会被物理引擎驱动,只能通过 (Transform) 对其进行操作。对于移动平台,或者如果要动画附加了 HingeJoint 的刚体,此属性将非常有用。
Interpolate:仅当在刚体运动中看到急动时才尝试使用提供的选项之一。
- None:不应用插值。
- Interpolate:根据前一帧的变换来平滑变换。
- Extrapolate:根据下一帧的估计变换来平滑变换。
Collision Detection:用于防止快速移动的对象穿过其他对象而不检测碰撞。
- Discrete
对场景中的所有其他碰撞体使用离散碰撞检测。其他碰撞体在测试碰撞时会使用离散碰撞检测。用于正常碰撞(这是默认值)。 - Continuous
对动态碰撞体(具有刚体)使用离散碰撞检测,并对静态碰撞体(没有刚体)使用基于扫掠的连续碰撞检测。设置为_连续动态 (Continuous Dynamic) 的刚体将在测试与该刚体的碰撞时使用连续碰撞检测。其他刚体将使用离散碰撞检测。用于连续动态 (Continuous Dynamic) 检测需要碰撞的对象。(此属性对物理性能有很大影响,如果没有快速对象的碰撞问题,请将其保留为 Discrete 设置) - Continuous Dynamic
对设置为连续 (Continuous)和连续动态 (Continuous Dynamic)碰撞的游戏对象使用基于扫掠的连续碰撞检测。还将对静态碰撞体(没有刚体)使用连续碰撞检测。对于所有其他碰撞体,使用离散碰撞检测。用于快速移动的对象。 - Continuous Speculative
对刚体和碰撞体使用推测性连续碰撞检测。这也是可以设置运动物体的唯一 CCD 模式。该方法通常比基于扫掠的连续碰撞检测的成本更低。
Constraints:冻结。对刚体运动的限制。
- Freeze Position
有选择地停止刚体沿世界 X、Y 和 Z 轴的移动。 - Freeze Rotation
有选择地停止刚体围绕局部 X、Y 和 Z 轴旋转。
1.2 碰撞器组件
常用:Box、Sphere、Capsule
不常用:Wheel 环状、车轮 、Mesh、Terrain 地形
车轮参数
Mass:车轮的质量
Radius:车轮的半径
Wheel Damping Rate:这是应用于车轮的阻尼值
Suspension Distance:车轮悬架的最大延伸距离(在局部空间中测量)。悬架始终向下延伸穿过局部 Y 轴。
Force App Point Distance:此参数定义车轮上的受力点。此距离应该是距车轮底部静止位置的距离(沿悬架行程方向),以米为单位。当 forceAppPointDistance = 0 时,受力点位于静止的车轮底部。较好的车辆会使受力点略低于车辆质心。
Suspension Spring:悬架尝试通过增加弹簧力和阻尼力来到达目标位置 (Target Position)
- Spring
弹簧力尝试到达目标位置。值越大,悬架达到目标位置就越快 - Damper
抑制悬架速度。值越大,悬架弹簧移动就越 - Target Position
悬架沿悬架距离 (Suspension Distance) 的静止距离。1 对应于完全展开的悬架,0 对应于完全压缩的悬架。默认值为 0.5,与常规汽车的悬架行为匹配。
Forward Friction:车轮向前滚动时轮胎摩擦的特性。
Sideways Friction:车轮侧向滚动时轮胎摩擦的特性。
- Extremum Slip:曲线的极值点。
- Extremum Value:曲线的极值点。
- Asymptote Slip:曲线的渐近点。
- Asymptote Value:曲线的渐近点。
- Stiffness:
Extremum Value 和 Asymptote Value 的乘数(默认值为 1)。改变摩擦力的刚度。将此值设置为零将完全禁用车轮的所有摩擦力。通常在运行时修改刚度以使用脚本来模拟各种地面材质。
注意:
不必通过转动或滚动 WheelCollider 对象来控制汽车;附加了 WheelCollider 的对象应始终相对于汽车本身固定
网格参数
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:
使物理引擎在网格中删除相等的顶点。启用此设置后,物理引擎将合并具有相同位置的顶点。这对于运行时发生的碰撞反馈十分重要。
Mesh:引用需要用于碰撞的网格。
网格烹制:
网格烹制将常规网格更改为可以在物理引擎中使用的网格。烹制会构建用于物理查询的空间搜索结构(如 Physics.Raycast)以及用于接触生成的支持结构。Unity 在碰撞检测中使用网格之前烹制所有这些网格。这可在导入时 (Import Settings > Model > Generate Colliders) 或运行时进行。
地形参数
Terrain Data:地形数据
Enable Tree Colliders:选中此属性时,将启用树碰撞体
1.3 碰撞检测函数
OnCollisionEnter(Collision collision)
OnCollisionStay(Collision collision)
OnCollisionExitCollision collision)
Collision参数
二、物理材质
决定交互方式 碰撞效果:是否有弹跳损失等
创建:Project右击->Create->Physic Material。注意2D和3D的区别
物理材质参数
Dynamic Friction:
已在移动时使用的摩擦力。通常为 0 到 1 之间的值。值为零就像冰一样,值为 1 将使对象迅速静止(除非用很大的力或重力推动对象)
Static Friction:
当对象静止在表面上时使用的摩擦力。通常为 0 到 1 之间的值。值为零就像冰一样,值为 1 将导致很难让对象移动。
Bounciness:
表面的弹性如何?值为 0 将不会反弹。值为 1 将在反弹时不产生任何能量损失,预计会有一些近似值,但可能只会给模拟增加少量能量。
Friction Combine:两个碰撞对象的摩擦力的组合方式。
- Average:对两个摩擦值求平均值。
- Minimum:使用两个值中的最小值。
- Maximum:使用两个值中的最大值。
- Multiply:两个摩擦值相乘。
Bounce Combine:
两个碰撞对象的弹性的组合方式。其模式与 Friction Combine 模式相同
三、触发检测
不产生物理效果的碰撞。2个碰撞器,1个刚体。
is trigger = true;
3.1 触发检测函数
OnTriggerEnter(Collider collider)
OnTriggerStay(Collider collider)
OnTriggerExit(Collider collider)