刚体(Rigidbody)
Contents
碰撞产生的条件
两个物体都要有碰撞器 至少有一个物体有刚体组件
刚体组件
面板参数
- Mass 质量:默认单位为千克 质量越大惯性越大
- Drag空气阻力:根据力移动对象时影响对象的空去阻力大小 0代表没有阻力
- Angular Drag根据扭矩旋转对象时影响对象的空气阻力大小 0代表没有阻力
- Use Gravity 是否受到重力影响
- Is Kinematic 如果启用此选项,则对象将不会呗物理引擎驱动,只能通过(Transform)对其进行操作,对于移动平台,或者如果要动画化附加了HingeJoint的刚体,此属性将非常有用
- InterPolate插值运算 让刚体移动更平滑 (物理系统是在Fixed Update中计算的,如果Fixed Update的更新频率很低 ,可以使用插值运算来平滑移动 一般使用前一帧)
- None 不应用差值计算
- Interpolate根据前一帧来平滑移动
- Extrapolate根据下一帧来平滑移动
- Collision Detection碰撞检测模式:可用于解决快速移动的对象穿过其他对象而不触发碰撞的问题
- Discrete离散检测 :对场景中所有其他碰撞体使用离散碰撞检测 默认值
- Continuous连续检测 :对于刚体 使用离散检测,对于没有刚体的物体 使用连续碰撞检测
- Continuous Dynamic连续动态检测 :对设置为连续和连续动态的刚体使用 连续检测 对于没有刚体的物体使用连续碰撞检测
- Continuous Speculutive 连续推测检测:对刚体和碰撞体使用推测性连续碰撞检测,该方法通常笔连续动态碰撞检测成本更低
- 性能消耗关系:动态连续检测>连续推断检测>连续检测>离散检测

- Constraints约束 对刚体运动的限制
- FreezePosition 有选择的停止刚体沿世界XYZ轴移动
- FreezeRotaition有选择的停止刚体沿世界XYZ轴旋转
刚体加力
获取刚体组件
//获取刚体
Rigidbody rigidBody;
rigidBody = GetComponent<Rigidbody>();添加力
//世界坐标系 Z轴正方向添加了一个力
//加力过后 对象是否停止移动 是由阻力决定的
rigidBody.AddForce(Vector3.forward * 10);
//本地坐标系
rigidBody.AddRelativeForce(Vector3.forward *10);添加扭矩力
//世界坐标
rigidBody.AddTorque(Vector3.up * 10);
//本地坐标
rigidBody.AddRelativeTorque(Vector3.up * 10);直接修改速度
rigidBody.velocity = Vector3.forward * 5;模拟爆炸效果
//第一个参数力的大小
//第二个参数 爆炸的中心
//第三个参数 爆炸的半径
//只影响调用了这个方法的对象
rigidBody.AddExplosionForce(100,Vector3.Zero,20);力的模式
- 主要的作用 主要就是 计算的方式不同
- 由于计算方式不同 最终的移动速度也会不同
- ForceMode.Acceleration 给物体增加一个持续的力 忽略其质量
- ForceMode.Force 给物体增加一个持续的力 与物体的质量有关
- ForceMode.Impulse 给物体增加一个瞬间的力 与物体的质量有关 忽略时间默认1
- ForceMode.VelocityChange 给物体一个瞬间的力 忽略质量
rigidBody.AddForce(Vector3.forward * 10,ForceMode.Force);力场脚本
- 可在Inspector面板中添加Constant Force组件
- 添加Constant Force组件时会自动添加一个刚体组件
- 可以通过面板上的参数 给这个对象一个持续的力
刚体的休眠
在某些情况下 添加了刚体的物体 会不参与物理计算,这是因为Unity为了节约性能 给刚体增加了一个休眠机制 可以通过脚本来判断是否为休眠状态
if(rigidBody.IsSleeping())rigidBody.WakeUp();