参考资料
【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)检测碰撞。
二、两个对象要么都收到碰撞事件,要么都收到触发事件,不会出现一个收到触发事件,一个收到碰撞事件的情况。
刚体加力
让一个物体产生位移的几种方式
直接在Update生命周期函数中 改变Transform当中的Position属性
直接在Update生命周期函数中 使用Transform提供的API TransLate这个方法
通过加力
通过改变刚体速度变量
刚体自带力的方法
加力过后 对象是否停止移动 是由阻力决定的
如果阻力为0 那给了一个力过后 始终 是不会停止运动
// 1.首先应该获取刚体组件
rigidBody = this.GetComponent<Rigidbody>();
// 2. 如果想要在 世界坐标系方法中 让对象 相对于自己的面朝向动
rigidBody.AddForce(this.transform.forward * 10);
// 3. 添加力(相对本地坐标)
rigidBody.AddRelativeForce(Vector3.forward * 10);
评论区