Cocos的碰撞系统设计者堪称天才,我只花了两个小时就找到了问题所在。
碰撞组件中的Collider并不具备物理特性,意思是两个带Collider组件的物体发生碰撞,并不会有任何物理上的反馈,这和刚体没有任何关系,但是,碰撞事件的触发还只能用这几个Collider
下面这几个Collider才具有物理特性,在添加的时候会自动加上RigidBody(这点还行,可圈可点)
综上,如果你想在产生物理效果的同时也分发碰撞函数,就必须把Collider,PhysicsCollider,RigidBody这三个组件全部加上
这还不算完,你需要在代码里开启全局的碰撞系统
cc.director.getCollisionManager().enabled = true; cc.director.getPhysicsManager().enabled = true;
嗯,考虑得非常全面,生怕初学者不小心开启了碰撞检测,超级贴心,给你个么么哒?
吐槽了那么多,给点干货吧
碰撞系统回调函数
碰撞产生时 onCollisionEnter: function (other, self)
碰撞保持时 onCollisionStay: function (other, self)
碰撞结束时onCollisionExit: function (other, self)
other是产生碰撞的另一个碰撞组件,self是产生碰撞的自身的碰撞组件。
Collider component 的 enabled 是单个对象的碰撞检测是否开启
node.getComponent(cc.CircleCollider).enabled = false
发生物理碰撞的双方RigidBody的Type属性必须有一个Static一个Dynamic(这样可以确保不互相穿过)
注意这里的getCollisionManager,我之前的onCollisionEnter不触发,就是因为写成了
cc.director.getPhysicsManager().enabled = true;
如果要用上面这句的话碰撞事件应该要是
// 只在两个碰撞体开始接触时被调用一次 onBeginContact: function (contact, selfCollider, otherCollider) { console.log('有人碰到了玩家'); }, // 只在两个碰撞体结束接触时被调用一次 onEndContact: function (contact, selfCollider, otherCollider) { }, // 每次将要处理碰撞体接触逻辑时被调用 onPreSolve: function (contact, selfCollider, otherCollider) { }, // 每次处理完碰撞体接触逻辑时被调用 onPostSolve: function (contact, selfCollider, otherCollider) { }
————————————————
原文链接:https://blog.csdn.net/qq_15020543/article/details/88616613
原文链接2:https://blog.csdn.net/qq_42661974/article/details/86217007