Le moteur physique
Présentation du moteur physique
Afin de rendre réaliste le comportement des objets dans une scène, il faut l’aide d’un moteur physique permettant d’appliquer la gravité, de calculer les collisions et plus simplement, d’appliquer une force. Tout cela est fourni de base dans Unity et s’applique aux objets grâce à des composants comme le Rigidbody ou le Collider.
Il est donc possible de créer dans une scène de nombreux objets qui pourront réagir les uns avec les autres de façon réaliste. Bien entendu, chaque objet peut être contrôlé via un script afin de lui ajouter une force pour le mettre en mouvement par exemple.
Unity fonctionne avec deux moteurs physiques distincts, un pour la 3D et un autre pour la 2D. Leurs fonctionnements sont quasiment similaires, ils utilisent seulement des composants différents (Rigidbody pour la 3D et Rigidbody2D pour la 2D). Cela est dû au fait que le nombre de dimensions à prendre en compte est différent, ce qui simplifie les calculs pour un jeu 2D, une dimension en moins étant à gérer.
Pour bien comprendre comment fonctionnent les différents composants avec le moteur physique 3D, nous allons créer tout au long de ce chapitre des exemples d’utilisation de ceux-ci.
Dans ce livre, nous ne traiterons que des composants utilisés pour le moteur physique...
Le composant Rigidbody
1. Introduction
Le Rigidbody est le composant de base afin d’activer le comportement du moteur physique à un objet. Une fois le composant ajouté à un GameObject, celui-ci devient influencé par la gravité ainsi que par les forces qui lui sont appliquées.
2. La gravité
Nous allons voir comment mettre en place la gravité, la paramétrer mais aussi la désactiver.
Créez une nouvelle scène (File - New Scene).
Dans la fenêtre Hierarchy, ajoutez une sphère à la scène (Create - 3D Object - Sphere).
Dans la fenêtre Inspector, ajoutez-lui le composant Rigidbody (Add Componant - Physics - Rigidbody).
Le composant Rigidbody est donc paramétré par défaut pour avoir une masse (Mass) à 1 et pour être sensible à la gravité, la propriété Use Gravity étant cochée. Si vous lancez le jeu, vous devriez donc voir la sphère tomber à l’infini ce qui n’est pas le cas sans le composant Rigidbody.
Ouvrez la fenêtre PhysicsManager à partir du menu Edit - Project Settings - Physics et inversez la gravité en modifiant la valeur de Gravity sur l’axe Y à 9.81, la valeur par défaut étant -9.81.
En relançant l’application, la sphère ne devrait plus être attirée...
Le composant Collider
1. Introduction
Pour permettre à un objet de pouvoir rentrer en collision avec un autre, les deux objets doivent obligatoirement contenir un composant de type Collider. Ce composant définit la forme de l’objet qui sera utilisé pour détecter les collisions. Totalement transparente, cette forme est très souvent une approximation de l’objet pour des raisons de performance car plus la forme est simple, plus les calculs de détection de collisions le sont aussi. Il n’est pas nécessaire qu’elle soit parfaitement représentative de l’objet réel car cela ne provoque que très peu de changement au niveau de la jouabilité.
2. Statique ou dynamique
Chaque objet peut disposer d’un composant Collider, qu’il ait un Rigidbody ou non. On parle de static collider dans le cas où un objet ne possède pas de Rigidbody comme le sol ou un mur par exemple. Il est recommandé de ne pas modifier le Transform de cet objet car cela peut poser des problèmes de performance. Dans le cas où l’objet contient un Rigidbody, on parle de dynamic collider. Lorsque deux dynamic colliders entrent en collision, ils bougeront tous les deux. Ce qui n’est pas le cas lors d’une collision entre un static collider et un dynamic collider car seul l’objet ayant un Rigidbody bougera.
3. Les colliders primitifs
Unity met à disposition des colliders, dits primitifs, reposant sur des formes géométriques simples, ce qui permet des performances accrues.
a. SphereCollider
Ce composant permet de représenter une forme sphérique. Il est défini grâce aux propriétés Center et Radius. Le rayon (Radius) est obligatoirement le même sur les trois axes, il n’est pas possible de définir un rayon différent sur chacun des axes.
b. BoxCollider
Ce composant permet de représenter une forme cubique. Il est défini grâce aux propriétés Center et Size. Contrairement au SphereCollider, il est possible de définir une taille (Size) différente pour chacun des axes. Pour ajouter un collider pour un mur ou un sol, on utilisera ce type de collider.
c. CapsuleCollider
Ce composant permet de représenter une forme cubique coupée en deux avec une partie cylindrique en son centre. Il est défini...
Les composants Joints
1. Introduction
Pour assembler un objet avec un autre, Unity fournit des composants permettant de mimer des joints de différentes sortes. Il va donc être possible de lier un objet statique, comme un plafond, pour lui fixer un objet dynamique, comme une lampe suspendue. Cette lampe pourra donc se balancer librement grâce à l’ajout d’un composant permettant de définir la liaison entre les deux objets (axes de rotation…).
2. FixedJoint
Le composant FixedJoint permet de contraindre le mouvement d’un objet par rapport à un autre. Concrètement, cela revient à la même chose que l’assemblage de deux objets en utilisant un lien de parenté (parent - fils). Néanmoins, il est plus facile de déconnecter la jointure via le FixedJoint et la propriété Connected Body plutôt que de refaire la hiérarchie des objets. Mais la grande force du composant est de pouvoir définir une force de rupture (Break Force et Break Torque) à partir de laquelle la liaison est brisée.
3. SpringJoint
Le composant SpringJoint permet de définir une liaison de type ressort. De la même manière que le FixedJoint, les deux objets sont liés mais une certaine distance entre les deux est tolérée.
La propriété Spring permet de régler la force du ressort tandis que la propriété...