Collision,Trigger,ChacterController互相之间的碰撞检测的结论

发表于2020-07-08
评论0 5.9k浏览

最近在做Unity物理碰撞有关的东西。正好总结记录一下。

在unity中,碰撞检测分3种:Collision,Trigger,ChacterController

Collision:

MonoBehaviour.OnCollisionEnter(Collision collision) 当进入碰撞器

MonoBehaviour.OnCollisionExit(Collision collision) 当退出碰撞器

MonoBehaviour.OnCollisionStay(Collision collision)  当停留在碰撞器

假如A,B两个都是Collision,也就是没有勾选isTrigger。那么如果要发生碰撞,其中之一必须要有Rigidbody,或者两者都有。

  • 情况1:A,B都有Rigidbody,那么当接触时离开时,AB都会收到相关消息。
  • 情况2:A有,B没有Rigidbody。没有Rigidbody的Collision是一个静止的碰撞物理碰撞体,怎么理解呢,看下面的描述:

那么A去碰B,AB都可触发。并且A会弹开,B不动。

B去碰A,AB都不会触发事件,A不一定会动。

也就是说呢,必须由Rigidbody去发起碰撞才会有事件回调

 

Trigger:

MonoBehaviour.OnTriggerEnter(Collider collider)当进入触发器

MonoBehaviour.OnTriggerExit(Collider collider)当退出触发器

MonoBehaviour.OnTriggerStay(Collider collider)当停留在触发器

假如A,B是两个Trigger或者其中之一是Trigger.

那么如果想要碰撞消息,其中之一必须要有Rigidbody,或者两者都有。

情况1,两者都有Rigidbody,互碰都有消息触发

情况2:,A有Rigidbody,B没有,互碰都有消息触发。

情况3: A,B都没有Rigidbody,不会有消息触发

也就是说这种方式,只有其中一个有Rigidbody,不管谁碰谁两者都有消息回调。

 

!!Collison和Trigger是不共存的。只能触发其中一种,通过上面描述的满足条件就已经可以看出来了。

 

ChacterController:

这是一种特殊的物理,是为了方便角色控制,但又不希望它像刚体一样受到物理模拟影响而出现的。

并且只有在调用Move,SimpleMove之后产生位移才检测。如果静止不动,或者不调用移动方法,则不检测。

MonoBehaviour.OnControllerColliderHit(ControllerColliderHit hit)

 

  • 假如A,B都是CharacterController

B不动,A移动去碰B,只有A会获得回调。

  • 假如A是ChacterController,B是Collision,

B没有刚体的情况下

1.那么A移动去碰B,则A有消息回调OnControllerColliderHit,并且B不动,A不会弹开。

2.B去碰A, A会被挤开,但是不会触发任何消息回调。

B有刚体,并且没有勾选isKinematic的情况下:

A去碰B,A只有OnControllerColliderHit回调,B不动,A不会弹开

B去碰A,A,B都只能收到OnCollisionEnter回调。

  • 假如A是ChacterController,B是Trigger。

则A,B互碰,双方都可以收到Trigger回调,A,B有无刚体没有影响

总结一下:与其他做碰撞,不需要添加Rigidbody。

如果另一个是Collision或者ChaterController,必须由ChacterController通过调用移动函数发起碰撞,ChaterController所在物体会有OnControllerColliderHit回调,被撞的则不会收到碰撞消息

如果另一个是Trigger则,无论谁碰谁,双方都只有Trigger的回调。

另一个特殊的情况是,Collision是刚体,则若是Collision发起碰撞,撞到了ChaterController.则双方都只有Collision回调。ChaterController不会有OnControllerColliderHit

 

  • 允许他人重新传播作品,但他人重新传播时必须在所使用作品的正文开头的显著位置,注明用户的姓名、来源及其采用的知识共享协议,并与该作品在磨坊上的原发地址建立链接
  • 可对作品重新编排、修改、节选或者以作品为基础进行创作和发布
  • 不可将作品进行商业性使用
  • 需在以作品基础上创作的演绎作品上适用相同类型的知识共享许可条款

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: