Types de collision
La collision dans l'Unreal Engine est similaire à Unity mais présente quelques différences qui sont traitées ici. Si vous avez utilisé la détection de collision basée sur les couches de Unity, les paramètres de collision du projet devraient ressembler à la matrice de collision. Vous pouvez y accéder en allant dans Modifier > Paramètres du projet > Collision. Si vous développez l'onglet Préréglage, vous pouvez voir tous les profils prédéfinis par défaut avec une description de leur fonction.
Vous remarquerez qu'Unreal dispose de quelques options supplémentaires en ce qui concerne la résolution des collisions. Elles sont traitées en profondeur dans l'Aperçu de collision Unreal Engine. Ce niveau de précision dans la détection des collisions permet d'améliorer les performances de votre jeu. Il est important de savoir que :
Les canaux ou les collisionneurs individuels peuvent être réglés sur Blocage, Chevauchement ou Ignorer ;
Une erreur fréquente consiste à ne pas cocher correctement la case Générer événements de chevauchement sur vos collisionneurs lorsque vous avez besoin de ces événements ;
La géométrie statique doit être bloquante et se chevaucher, mais il est possible de ne pas générer d'événements de chevauchement ou d'impact, car ils ne sont pas nécessaire pour le gameplay ;
Des événements de chevauchement peuvent être générés même si un objet en bloque un autre, en particulier lors des déplacements à grande vitesse. Dans Unity, cela peut être un problème si vous modifiez directement la translation au lieu d'un composant Rigidbody. Cela contourne les considérations d'ordre physique ;
Dans Unreal, lorsque vous appelez une fonction qui met à jour la transformation d'un acteur, deux paramètres booléens dictent comment vous voulez que l'acteur se déplace :
Balayage s'active pour déclencher des chevauchements et arrête l'acteur avant la destination s'il est bloqué. Téléportation détermine si la vitesse physique est préservée ou non.
Les canaux peuvent également être utilisés pour les traces qui sont équivalentes à la projection physique d'Unity (c.-à-d. Raycast, SphereCast, etc.). Vous pouvez transmettre le canal lors de l'appel de la fonction Tracé de ligne de la même manière que vous transmettriez le masque de couche dans un Raycast dans Unity.
Types de collision personnalisés Parrot
Parrot dispose de quelques configurations personnalisées de canaux d'objets de collision : Joueur, Boulet de canon, et Ennemi.
En ajoutant ces types d'objets, Parrot peut contrôler exactement comment ces canaux d'objets interagissent avec les canaux de traces au fur et à mesure que les traces de collision se produisent dans le monde. Une réponse par défaut est définie pour ce qui devrait généralement se produire, mais elle peut être personnalisée. Parrot propose également quelques préréglages de canaux de traces personnalisés : Joueur, OverlapAllPlayers, BlockAllPlayers, Boulet de canon et Ennemi.
Ces préréglages sont particulièrement utiles pour les déclencheurs de gameplay. Par exemple, OverlapAllPlayers peut ignorer toutes les autres collisions et se contenter de répondre aux événements de collision avec les types d'objets de collision du joueur. Si vous regardez les paramètres de collision pour différents maillages dans le jeu, vous verrez que ces préréglages sont fréquemment utilisés.
Les paramètres de collision peuvent également être personnalisés pour chaque maillage si nécessaire.
Limites du monde
Lors de la création de vos niveaux, il convient de tenir compte des Limites du monde. Celles-ci peuvent être gérées dans Paramètres du monde > Monde. Vous pouvez implémenter un type de dégât personnalisé lorsqu'un acteur interagit avec ces limites définies du monde. Les limites Parrot utilisent une combinaison du paramètre du monde KillZ et des volume de déclenchement Hors limites.
Volumes de déclenchement
L'Unreal Engine dispose d'acteurs de volume de déclenchement intégrés (voir Acteurs de volume de déclenchement dans l'Unreal Engine) qui peuvent être utilisés pour déclencher des événements. Des exemples d'utilisation par les développeurs dans Parrot sont les volumes de déclenchement Hors limites et Ligne d'arrivée. Les volumes de déclenchement sont souvent utilisés en conjonction avec le blueprint de niveau (voir le document du développeur Les blueprints de niveau dans Parrot) mais ce n'est pas obligatoire. Le déclencheur de Parrot pour Hors limites est un déclencheur de boîte avec un graphique d'événements simple :
Si vous regardez les paramètres de collision de l'acteur dans le panneau Détails, vous verrez que c'est le préréglage du canal de collision qui fait le plus gros du travail ici.
Ramassage de bonus
Prenons un exemple pratique du système de collision avec l'implémentation du ramassage de bonus de Parrot. Si vous ouvrez BP_PickupBase dans Contenu > Blueprints > Ramassages et regardez le hublot, vous pouvez voir la hiérarchie qui contient le composant de collision.
Les paramètres de collision et la fonction Hors limites ont un préréglage de déclenchement qui génère des événements de chevauchement avec les joueurs :
Si vous regardez le graphique d'événements, vous verrez l'événement ActorBeginOverlap avec Autre acteur comme paramètre. Cet événement fonctionne de la même manière que OnCollisionEnter dans Unity. La différence ici est qu'au lieu de recevoir un composant de collision, vous recevez l'acteur lui-même.
Parrot projette pour vérifier que l'acteur est un joueur qui a chevauché. L'événement OnPickedUp est appelé ensuite. Cela permet aux classes de blueprint dérivées de définir leur propre comportement surOnPickedUp tandis que la classe de base gère elle-même l'événement de chevauchement de l'acteur.
Les développeurs utilisent le blueprint de base pour faire en sorte que tous les ramassages jouent un son et génèrent des effets de particules. Les variables relatives au son de ramassage et à l'effet de particules sont modifiables par instance, de sorte qu'elles peuvent être définies dans les valeurs par défaut des classes dérivées. Les valeurs par défaut des classes sont situés dans l'Éditeur de blueprint en haut du bouton Compiler :
Un exemple de modification des valeurs par défaut des classes peut être trouvé avec le ramassage de vitesse, qui utilise un système Niagra avec des particules vertes (alors que le ramassage de cœur qui utilise des particules roses). De manière similaire, la maillage de l'objet à ramasser lui-même peut être défini sur les blueprints dérivés. La dernière étape de la logique de chevauchement consiste à détruire l'acteur de ramassage, car nous ne voulons pas qu'il persiste après qu'un joueur l'a ramassé.
Avec seulement quelques nœuds, vous êtes en mesure de créer une logique robuste qui peut facilement s'étendre à des blueprints dérivés. Tous les blueprints dérivés découlent d'un événement de chevauchement lié à l'acteur.
Le personnage du joueur saute sur un ennemi
Un autre exemple intéressant est celui du joueur qui saute sur un ennemi. Le type de collisioneur de la capsule de l'ennemi est "ennemi" et entre en collision avec les types d'objets du joueur. Les ennemis munis d'une épée ont également un événement de chevauchement similaire. Ces zones sont communément appelées "boîtes de collision" et se situent à l'endroit où une attaque est efficace.
Mais lorsqu'un joueur saute sur un ennemi, comment Parrot contourne-t-il ce problème ? La solution était de placer une boîte de dégâts sur les têtes des ennemis. Lorsque le joueur chevauche ce volume de boîte de dégâts, le personnage joueur peut alors effectuer une série de contrôles pour voir s'il s'agit d'un saut valide en fonction de l'emplacement du personnage, de l'emplacement de la boîte de dégâts et de l'étendue de la boîte. Si les contrôles sont réussis, le joueur peut effectuer son saut et frapper l'ennemi. Le gros du travail est une fois de plus effectué par les canaux de collision qui filtrent uniquement les chevauchements qui intéressent Parrot : un objet de collision du joueur et un ennemi sur le volume de la boîte de dégâts.