参考资料

【1】梦小天幼:[详解Unity中的刚体和碰撞体组件](https://blog.csdn.net/weixin_43147385/article/details/124042051

刚体

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

刚体RigidBody组件信息

  • mass:质量

  • Drag: 阻力,其中阻力的方向与运动方向完全相反, 该参数越大,受到的阻力就越大,速度衰减速度就越快。当该值很大很大,就会让物体立即停止运动

  • Angular Drag:角阻力,与物体的旋转方向相反,物体在任何方向上的旋转都会收到影响。如果设置为0,则物体一开始旋转就不会停止。该值越大,物体就无法旋转了。

  • Use Gravity:是否使用重力

  • Is Kinematic是否遵循运动学,如果勾选,则物体就会不受到重力、速度、阻力等力的影响,只会受到脚本和动画位移的影响。值得注意的是:它依然会影响带有刚体的其他物体

  • Interpolate:让刚体物体移动更平滑

    • Interpolate:根据前一帧来平滑变换

    • Extrapolate:根据下一帧来平滑变换

  • Collision Detection:碰撞检测,这个属性一般控制避免高速移动物体穿过其他对象而没有发生碰撞。比如:快速移动,导致穿墙

    • Discrete:离散碰撞检测(正常的碰撞),(两个物体发生碰撞的条件是:至少有一个刚体+2个碰撞体)。我们假设两个物体A和B,其中物体A是开启了离散碰撞检测。

      • 若物体B是离散碰撞检测、连续检测、连续动态检测,则采用离散碰撞检测

      • 若物体B是连续推测检测,则采用连续推测检测

    • Continuous:连续检测(此属性对物理性能有很大影响,如果没有快速对象的碰撞问题,请将其保留为 Discrete 设置)

    • Continuous Dynamic 连续动态碰撞检测(适用于高速移动的物体)

  • Constraints;约束条件,限制物体旋转和位移的参数

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

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

碰撞器和触发器

碰撞器表示物体的体积(形状),刚体会利用体积进行碰撞计算,模拟真实的碰撞效果,产生力的作用

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

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

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

当异性物体使用多种碰撞器时 ,刚体对象的子对象碰撞器会参与碰撞检测

物理材质

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

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

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

  • Friction Combine:两个碰撞对象的摩擦力的组合方式。

    • Average:对两个摩擦值求平均值

    • Minimum:使用两个值中的最小值

    • Maximum:使用两个值中的最大值

    • Multiply:两个摩擦值相乘。

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

碰撞检测

1. 如何发生碰撞事件?

发生碰撞的主体一定是要带刚体的,即只有带刚体的碰撞体去撞其他碰撞体时,双方才会收到碰撞事件。

一、控制A(刚体加碰撞体)撞击 静止的B(只有碰撞体),双方能收到碰撞事件。

二、控制B(只有碰撞体)撞击 静止的A(刚体加碰撞体),双方收不到碰撞事件。

三、让A(刚体加碰撞体)自由下落,然后控制B(只有碰撞体)去撞击A,双方能受到碰撞事件。

得出的结论似乎是如果碰撞双方只有一个有刚体,那么那个刚体一定要处于运动的状态下才会有碰撞事件发生。

此外还有两点:

一、产生触发事件的两个物体会相互穿越,isTrigger检测的是可穿越碰撞,准确的说是因为开启IsTrigger那个物体会被物理引擎锁忽略掉,所以会产生两个物体穿越的情况。如果人物有Rigidbody,而且想让人物和地面产生碰撞事件且不穿过地面,可以不勾选isTrigger,用OnCollisionEnter(Collision collison)检测碰撞。

二、两个对象要么都收到碰撞事件,要么都收到触发事件,不会出现一个收到触发事件,一个收到碰撞事件的情况。

刚体加力

让一个物体产生位移的几种方式

  1. 直接在Update生命周期函数中 改变Transform当中的Position属性

  2. 直接在Update生命周期函数中 使用Transform提供的API TransLate这个方法

  3. 通过加力

  4. 通过改变刚体速度变量

刚体自带力的方法

加力过后 对象是否停止移动 是由阻力决定的

如果阻力为0 那给了一个力过后 始终 是不会停止运动

// 1.首先应该获取刚体组件
rigidBody = this.GetComponent<Rigidbody>();

// 2. 如果想要在 世界坐标系方法中 让对象 相对于自己的面朝向动
rigidBody.AddForce(this.transform.forward * 10);

// 3. 添加力(相对本地坐标)
rigidBody.AddRelativeForce(Vector3.forward * 10);