Unity两个物体发生碰撞的条件

好吧,网上好多资料显示发生碰撞条件如下:

两个对象都有Collider组件且至少一个有Rigidbody组件
其中至少一个物体(必须运动的)必须带有碰撞器(collider)+刚体(Rigidbody),另一个物体(可以静止也可以运动)也必须至少带有collider

也有说一方有CharacterController,另一方有Collider,于是这里对 CharacterController做点补充。

Unity圣典中的说法是:
 CharacterController角色控制器允许你在受制于碰撞的情况下很容易的进行运动,而不用处理刚体。(个人理解:用CharacterController组件,它包含Rigidbody组件的一些属性,就不用用Rigidbody组件了)。  角色控制器不受力的影响,仅仅当你调用Move函数时才运动。然后它将执行运动,但是受制于碰撞。
下面说说我自己的理解:
(1)添加了CharacterController组件后,人物将不受力影响,这时即使加上Rigidbody组件,并启用Use Gravity,人物也不会受重力影响,在脚本中通过rigidbody对人物施加力也是无效的。也就是说CharacterController屏蔽了Rigidbody的所有属性和方法。要控制CharacterController移动,可以通过在脚本中调用Move方法使其移动。
(2)虽然CharacterController不受力,但是有个例外是,它受碰撞的影响。
一般的碰撞发生条件是:碰撞的两个物体必须都有Collider,并且其中一个有Rigidbody。
但是如果一方有CharacterController,则不需要。这时碰撞发生的条件为:
一方有CharacterController,另一方有Collider。CharacterController本身就继承自Collider。

(3)碰撞发生时,CharacterController不会推动其它物体移动,也就是说CharacterController不会对它所碰撞的物体施加物理作用。除非我们在脚本中添加了OnControllerColliderHit()函数,在该函数中使用被碰撞物体的rigidbody对被碰撞物体施加力。

// this script pushes all rigidbodies that the character touches
var pushPower = 2.0;
function OnControllerColliderHit (hit : ControllerColliderHit) {
   var body : Rigidbody = hit.collider.attachedRigidbody;
   // no rigidbody
   if (body == null || body.isKinematic)
     return;   

   // We dont want to push objects below us
   if (hit.moveDirection.y < -0.3) 
     return; 

   // Calculate push direction from move direction, 
   // we only push objects to the sides never up and down
   var pushDir : Vector3 = Vector3(hit.moveDirection.x, 0, hit.moveDirection.z);
   
   // If you know how fast your character is trying to move,
   // then you can also multiply the push velocity by that.
   // Apply the push
   body.velocity = pushDir * pushPower;
}


你可能感兴趣的:(unity,collider,刚体,碰撞器,rigidbody)