关于U3D的碰撞检测

-
-
2024-05-31

一、三种碰撞检测

检测函数均继承自MonoBehaviour,Enter和Exit只在进入和离开碰撞器时触发一次,Stay函数只要物体停留在碰撞器内则一直触发。

1、碰撞器 Collosion

  1. OnCollisionEnter(Collision collision)当物体进入碰撞器
  2. OnCollisionExit(Collision collision) 当物体离开碰撞器
  3. OnCollisionStay(Collision collision)  当停留在碰撞器内

碰撞规则:

两者其一必须有刚体!否则无效。

有刚体碰没刚体,两者均触发碰撞函数,有刚体则运动,没刚体不动

没刚体碰有刚体,不会触发碰撞函数

都有刚体,都触发碰撞函数

1、触发器 Trigger

Trigger是一种特殊的碰撞器,当勾选Collision中的IsTrigger选项时,碰撞器就被设为了触发器,不会再触发碰撞器函数,而是触发器函数。也会失去碰撞效果。

  1. OnTriggerEnter(Collider collider)当进入触发器
  2. OnTriggerExit(Collider collider)当退出触发器
  3. OnTriggerStay(Collider collider)当停留在触发器

碰撞规则:

两个Trigger或者其一是Trigger

两者其一必有刚体,互碰都有消息触发,均不是刚体则无效

角色控制器 CharacterController

角色控制器是一种特殊的碰撞器,是为了方便角色控制而设计的。只有调用Move,SimpleMove等移动函数之后才检测。角色控制器继承了碰撞器和刚体无需另行设置。

  1. OnControllerColliderHit(ControllerColliderHit hit)当角色碰撞到物体
 CharacterControllerCollisionTrigger
CharacterController谁主动碰撞,谁受到回调

没有刚体且没有IsKinematic

A去碰B,A只有OnControllerColliderHit回调

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

双方都可以收到Trigger回调,有无刚体没有影响

碰撞器有关的属性

刚体 Rigidbody

刚体组件用于模拟物体的物理行为。当你向一个物体添加刚体组件后,它将会受到物理引擎的控制,包括重力、碰撞、惯性等。这意味着物体将会对力的作用做出反应,从而产生运动、旋转和碰撞效果。

IsKinematic

当你将RigidbodyIsKinematic属性设置为true时,这意味着该物体将不受到物理引擎的力的影响,也就是说它不会受到重力、碰撞或其他物理效果的影响。

Layer

碰撞体必须在同一个layer或者包含另一个layer,否则无效。

总结

CharacterController与其他做碰撞,不需要添加Rigidbody,因为自带了。

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

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

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

 

参考:Unity手册 碰撞体

“您的支持是我持续分享的动力”

微信收款码
微信
支付宝收款码
支付宝

目录