碰撞事件
碰撞产生的条件
两物都有Collider
至少有一个带有RigidBody
回调方法
OnCollisionEnter(Collision other) 碰撞开始一瞬间时调用一次
OnCollisionStay(Collision other) 碰撞过程中相对运动时持续调用,每帧一次
OnCollisionExit(Collision other) 碰撞分离一瞬间时调用
回调方法参数
Collision.collider 当前物体所碰撞到的游戏对象
Collision.contacts[] 所有碰撞点的信息
触发事件
设置触发器
Is Trigger(是否开启触发器,触发器和碰撞体只能选择其一)
触发事件产生的条件
两物都是碰撞体
至少有一个带刚体
两碰撞至少有一个是触发器
回调函数
OnTriggerEnter(Collider other) 触发开始时,调用一次
OnTriggerStay(Collider other) 触发过程中每帧调用一次
OnTriggerExit(Collider other) 触发结束时调用一次
Collider other(Component类)
other:表示另一个有碰撞器的物体,不是当前物体
other.ComparaTag:判断此对象的标签是否符合输入的值返回bool
如果需要让某个物体触发碰撞器可以单独写个碰撞器/触发器代码挂载到那个物体上面
拓展:
- 如果需要只检测某一个碰撞器/触发器或只省略某一个碰撞器/触发器不检测可以在碰撞器/触发器方法里写入if语句判断 当前碰撞器/触发器的标签是否是需要触发的
- 获取碰撞点
- 只能在碰撞器中的contacts属性中获取他的碰撞点数组,然后使用里面的point方法查看碰撞坐标【其中一个Rigidbody一定要勾选Use Gravity这样才可以接收到反馈】
-
void OnCollisionEnter(Collision ctl) { ContactPoint contact = ctl.contacts[0]; Quaternion rot = Quaternion.FromToRotation(Vector3.up, contact.normal); Vector3 pos = contact.point; }