勇哥注:
unity中的2d物理效果基于开源的Box2D引擎,3d物理效果基于Nvidia PhysX,
包括几个关键组件:Rigidbody(刚体),Collider(碰撞器),关节(Joints)
我们只对3d物理效果有兴趣。
见图1:
场景中4个对象(先不算斜面上的cube)。
球体添加了Rigidbody
Cube有一个BoxCollider。
两个平面都添加了Mesh Collider。
播放后我们见到下面效果:
球体默认是有重力影响的,会掉到地板平面上。因为两个平面都有Mesh Collider,所以球体不能穿透地板。
鼠标可以拎起球体测,以模拟外力作用球体
球体无论怎么用力,都不可能撞开Cube,原因是Cube没有加Rigidbody刚体。
如果鼠标强行拖动球体,是可以穿过Cube的。(见图2)
(图1)
(图2)
Rigidbody参数如下:
Mass是物体质量,单位是千克kg,质量越大物体的惯性越大。
下面是球体和Cube都是质量为1时的撞击效果:
下面是球体质量为1000, cube质量为1的撞击效果:
那怎么把cube撞飞,而不是推走呢?
如果你只是把球体的mass改得很大,这是没有用的,因为质量再大,对这个场景例子中的球体的加速度没啥影响。
那我们如下图一样弄个很长的陡坡行不行呢?
答案是不行,你会发现球体是均速下来的。
这是因为这个坡和球体的摩擦力的原因。
为了降低球体,cube,两个平面的摩擦力,我们创建一个物理材质,并设置下面的参数。
把这个物体材质赋给四个对象的Collider组件。
这个时候就看到了我们想要的效果。
要想球体运动更快,要考虑下面几个方面:
1. 摩擦力
2. 阻力(Drag)
3. 刚体质量
球体的质量也会影响其加速性能。在相同的力作用下,质量较大的物体需要更大的加速度才能改变其运动状态。
虽然斜坡上的重力分量随质量增加而增加,但加速度却因质量增加而减小,二者可能相互抵消,导致匀速运动
4. 斜坡的角度
5. 物理材质中的Bounciness弹性
我们可以针对Cube的物理材质,把它的弹性增大,它就会像乒乓球一样被弹飞。
下图是我们把弹性改为5的效果。
最后聊下Use Gravity和Is Kinematic。
一个游戏对象可以去掉Use Gravity的勾选,这样就表示不受重力的影响。
要注意的是,这个对象还是受其它物理效果的影响的,比如受到撞击会移动与旋转。
重力只是物理属性中的一种。
如下图所示:
球体不受重力影响,但是被撞击后会保持持续运动,停不下来。跟太空失重环境下的效果一样。
如果把球体勾选了Is Kinematic(是运动学)。
则球体是撞不动的。
运动学只受Transform的控制(即相当于脚本自己来控制),不受物理效果的控制。
那如果我Use Gravity和Is Kinematic两个都勾选了,会怎么样?
答案是,只要你勾选了Is Kinematic,那么再勾Use Gravity没有任何作用。
最后说几个跟效果与性能相关的参数,它们的默认值一般情况下就够用了。
(1)Interpolate 是插值,控制Rigidbody在物理模拟过程中的运动平滑度。有助于解决对象拉动的问题。
(2)Collision Detection 这个是字面意思,碰撞检测的算法。默认值就最省cpu的算法。
(3)Constraints 可以约束 Position(移动)和Rotation(旋转)。就是说被撞物体可以控制它不向约束的方向旋转或者移动。
如果全部勾选了,就等于勾选了Is Kinematic的效果。
这个还有些用,因为我们气缸推动物料的时候,其实物料只要向一个方向动就行了,其它方向要被约束住。

