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