Cocos 物理碰撞不触发的坑


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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM