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;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值