Collision,Trigger,ChacterController互相之间的碰撞检测的结论
最近在做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