Comment Cocos Creator gère-t-il la physique et la détection des collisions ?

Comment Cocos Creator gère-t-il la physique et la détection des collisions ?

version cocos créateur :v3.6.1

Cocos Creator 3.x implémente la détection de collision

        Cocos Creator gère la physique et la détection des collisions en utilisant un moteur physique. Cocos Creator utilise le moteur physique Box2D par défaut et prend également en charge le moteur physique Chipmunk. Voici les étapes de base pour gérer la physique et la détection de collision :

    1. Créez un monde physique : ajoutez un composant physique à la scène, ce qui créera automatiquement un monde physique.

    2. Ajouter 刚体组件: ajoutez des composants de corps rigides aux nœuds qui doivent ajouter des effets physiques. Un corps rigide est un objet dans le monde physique, et des propriétés telles que la masse, le frottement et l'élasticité peuvent être définies ( cliquez sur le document officiel pour afficher les propriétés du corps rigide ).

3. Ajouter 碰撞体组件: Ajoutez un composant de corps de collision au nœud de corps rigide pour détecter les collisions. Cocos Creator prend en charge différents types de corps de collision, tels que des rectangles, des cercles, des polygones, etc. (cliquez sur le document officiel pour afficher les composants de collision) .

    4. Gérer les événements de collision ( 碰撞回调函数) : en ajoutant une fonction de rappel de collision, exécutez la logique correspondante lorsqu'une collision se produit entre les nœuds. Les informations détaillées de la collision peuvent être obtenues dans la fonction de rappel de collision, telles que le type de corps de collision, le point de collision, la collision normale, etc. (cliquez sur le document officiel pour afficher le rappel de collision ).

Voici un exemple simple montrant comment gérer la physique et la détection de collision dans Cocos Creator :

    5. Créez une scène et ajoutez un composant physique.

    6. Ajoutez deux nœuds dans la scène, ajoutez 刚体et 碰撞体composants respectivement :

insérez la description de l'image ici
        按照需求选择对应刚体类型( Cliquez sur le document officiel pour voir le type de carrosserie rigide )
Type de corps rigide

    7. Activez la surveillance des collisions :

    Ce n'est que lorsque la surveillance des collisions du corps rigide est activée que le composant correspondant est rappelé lorsque le corps rigide entre en collision

insérez la description de l'image ici

//代码开启
rigidbody.enabledContactListener = true;

    8. Ajoutez une fonction de rappel de collision à l'un des nœuds :

@ccclass('TestContactCallBack')
export class TestContactCallBack extends Component {
    
    
    start () {
    
    
        // 注册单个碰撞体的回调函数
        let collider = this.getComponent(Collider2D);
        if (collider) {
    
    
            collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this);
            collider.on(Contact2DType.END_CONTACT, this.onEndContact, this);
            collider.on(Contact2DType.PRE_SOLVE, this.onPreSolve, this);
            collider.on(Contact2DType.POST_SOLVE, this.onPostSolve, this);
        }

        // 注册全局碰撞回调函数
        if (PhysicsSystem2D.instance) {
    
    
            PhysicsSystem2D.instance.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this);
            PhysicsSystem2D.instance.on(Contact2DType.END_CONTACT, this.onEndContact, this);
            PhysicsSystem2D.instance.on(Contact2DType.PRE_SOLVE, this.onPreSolve, this);
            PhysicsSystem2D.instance.on(Contact2DType.POST_SOLVE, this.onPostSolve, this);
        }
    }
    onBeginContact (selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
    
    
        // 只在两个碰撞体开始接触时被调用一次
        console.log('onBeginContact');
    }
    onEndContact (selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
    
    
        // 只在两个碰撞体结束接触时被调用一次
        console.log('onEndContact');
    }
    onPreSolve (selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
    
    
        // 每次将要处理碰撞体接触逻辑时被调用
        console.log('onPreSolve');
    }
    onPostSolve (selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
    
    
        // 每次处理完碰撞体接触逻辑时被调用
        console.log('onPostSolve');
    }
}

    说明:注意刚体类型一定要选择好,两个节点都是static是无法触发碰撞回调( Voir Contraintes de réponse pour différents types de corps rigides )

        Tous les types de corps rigides ne peuvent pas entrer en collision les uns avec les autres. Les résultats sont les suivants :

Statique Dynamique Cinématique Animé
Statique
Dynamique
Cinématique
Animé

    9. Ajoutez le code au nœud, comme suit :
insérez la description de l'image ici
    10. Le résultat montre que
insérez la description de l'image ici
    l'étoile bleue à cinq branches peut être déplacée dans le système de ralenti. Le code est par exemple :

tween(this.node.getChildByName("Block")).to(1,{
    
    
    	position:new Vec3(200,0,0)
 }).start();

        Grâce aux étapes ci-dessus, vous pouvez gérer la physique et la détection des collisions dans Cocos Creator. Des effets physiques et une détection de collision plus complexes peuvent être obtenus en ajustant les propriétés des corps rigides et des collisionneurs et en ajoutant davantage de fonctions de rappel de collision.

最后,如果有些需求不要物理碰撞效果的话,在Collider2D(如BoxCollider2D),设置属性:sensor
sensor : boolean 一个传感器类型的碰撞体会产生碰撞回调,但是不会发生物理碰撞效果。

Je suppose que tu aimes

Origine blog.csdn.net/mingketao/article/details/130007046
conseillé
Classement