刚体组件详解:Rigidbody组件属性、质量与阻力、重力控制、刚体休眠与唤醒
好,咱们今天来聊聊刚体组件。说实话,刚体是Unity物理系统的基石。你想想看,没有刚体,碰撞检测就是个空壳子,物理模拟更是无从谈起。我个人习惯把刚体比作游戏对象的「物理身份证」——挂上它,对象才算真正进入了物理世界。
Rigidbody的核心属性
打开Rigidbody组件,你会看到一堆属性。别被吓到,其实常用的就那么几个。我一个个说。
| 属性 | 作用 | 我的建议 |
|---|---|---|
| Mass(质量) | 控制物体惯性大小 | 别设成0或负数,物理引擎会崩溃 |
| Drag(阻力) | 影响移动时的速度衰减 | 默认0.01,做漂浮效果可以调大 |
| Angular Drag(角阻力) | 影响旋转时的速度衰减 | 一般保持0.05,除非你要做陀螺 |
| Use Gravity | 是否受重力影响 | 默认勾选,做飞行物时记得取消 |
| Is Kinematic | 运动学模式 | 开启后不受物理力影响,但能推动其他物体 |
这里有个坑。我记得刚入行时,有个项目里子弹打不中敌人。查了半天,发现是敌人的刚体质量设成了0.001,碰撞响应几乎为零。嗯,物理引擎对极端值很敏感,尽量保持在0.1到100之间。
质量与阻力:一对好搭档
质量决定了物体「有多难被推动」。阻力则决定了「推动后能跑多远」。两者配合,能模拟出从保龄球到羽毛的各种手感。
关键公式:实际加速度 = 施加力 / 质量 - 阻力 × 速度
说白了,质量越大越难加速,阻力越大越容易减速。
我在项目中做过一个赛车游戏。轮胎的阻力调了整整两天。阻力太小,车像在冰面上滑;阻力太大,又像在泥里开。最后发现,Drag = 0.5配合Angular Drag = 0.3,手感最接近真实赛车。
// 动态调整阻力的例子
void ApplyAirResistance(Rigidbody rb, float speed)
{
// 速度越快,阻力越大
float dynamicDrag = 0.1f + speed * 0.01f;
rb.drag = Mathf.Clamp(dynamicDrag, 0.1f, 2.0f);
}
重力控制:不只是开关那么简单
很多人以为重力控制就是勾选Use Gravity。其实不然。你可以通过Physics.gravity全局调整重力方向,甚至为不同物体设置不同的重力效果。
小技巧:做太空题材时,把Physics.gravity设成Vector3.zero,所有物体就都失重了。但要注意,刚体仍然会保持惯性运动。
我曾经做过一个平台跳跃游戏。角色跳跃时,我希望下落更快、上升更慢。于是我在角色刚体上做了手脚:
void CustomGravity(Rigidbody rb)
{
if (rb.velocity.y > 0)
{
// 上升阶段:重力减半
rb.AddForce(Physics.gravity * 0.5f, ForceMode.Acceleration);
}
else
{
// 下落阶段:重力加倍
rb.AddForce(Physics.gravity * 2.0f, ForceMode.Acceleration);
}
}
这样跳起来手感就「扎实」多了。你想想看,如果上下重力一样,角色跳起来会像纸片一样飘。
刚体休眠与唤醒:性能优化的秘密武器
刚体休眠是个好东西。当一个刚体长时间不动,物理引擎会自动让它「睡觉」——停止物理计算。这能省下大量CPU资源。
但有个问题:休眠的刚体不会响应碰撞。如果你用代码移动它,它也不会自动醒来。需要手动唤醒。
注意:我曾经在项目中用transform.position直接移动一个休眠的刚体。结果子弹穿过去了,因为刚体根本没检测到碰撞。后来改成rb.MovePosition()才解决。
// 手动控制休眠与唤醒
void ManageSleep(Rigidbody rb)
{
// 检查是否休眠
if (rb.IsSleeping())
{
Debug.Log("刚体在睡觉");
}
// 强制唤醒
rb.WakeUp();
// 强制休眠(不推荐,除非你确定它不会再动)
rb.Sleep();
}
休眠的触发条件有两个:速度低于sleepThreshold,且持续一段时间。这个阈值可以在Project Settings → Physics里调整。默认是0.005,如果你发现物体「睡得太死」,可以调高一点。
避坑指南
嗯,最后分享几个我踩过的坑:
- 不要用Transform移动刚体——除非你设成Kinematic。否则物理引擎会跟你的代码打架,出现抖动或穿透。
- 质量不要相差太大——两个物体质量差超过100倍,碰撞时小物体会被「弹飞」。我见过一个乒乓球把汽车撞飞的bug,就是因为质量差了1000倍。
- 阻力不是摩擦力——Drag是空气阻力,跟地面摩擦是两码事。摩擦力要用
PhysicMaterial的动/静摩擦系数来控制。 - 休眠不等于禁用——休眠的刚体仍然占用内存,只是不参与物理计算。如果你要彻底移除物理效果,应该禁用组件或销毁它。
刚体组件说简单也简单,说复杂也复杂。关键是理解每个属性背后的物理意义。你想想看,一个游戏里几十上百个物体,每个都有不同的物理表现,靠的就是这些参数的组合。多调、多试,手感自然就出来了。