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