Collision,Trigger,ChacterController

转自Collision,Trigger,ChacterController互相之间的碰撞检测的结论-腾讯游戏学堂

在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值