Travailler avec Unity3D Physics

Ce tutoriel va vous apprendre à construire un jeu avec Unity3D! En cours de route, vous découvrirez l’importance de l’utilisation d’un moteur physique et vous éviterez ainsi d’innombrables heures d’animation manuelle. Continuer à lire!

Quel moteur de jeu moderne serait complet sans moteur physique? Chaque moteur de jeu actuel, qu'il s'agisse de 3D ou de 2D, possède une bibliothèque de physique, et Unity ne fait pas exception. La physique en temps réel est idéale pour simuler des interactions complexes entre des objets de votre jeu. Un moteur physique peut économiser une grande partie du codage manuel et de l'animation pour obtenir des mouvements réalistes, facilite grandement la détection des coups et permet d'introduire rapidement une foule de nouveaux mécanismes de jeu dans vos jeux..

Dans ce didacticiel, nous allons utiliser le moteur physique de Unity pour créer un jeu de renversement 3D similaire à BoomBlox et Angry Birds. Nous allons apprendre à donner aux objets différentes propriétés physiques, à les rendre capables de collision et même à leur permettre d'être détruits si les collisions sont suffisamment fortes..


Qu'est-ce qu'un moteur physique??

Un moteur physique fonctionne en simulant la façon dont les objets réagissent les uns avec les autres lorsque des forces leur sont appliquées. Ces forces peuvent être constantes, comme la gravité ou la vitesse d'un véhicule, tandis que d'autres sont brèves et puissantes, comme des explosions. Une simulation physique est parfois appelée «bac à sable» car seuls les objets de la simulation sont impactés. En effet, tous les objets de votre jeu ne doivent pas nécessairement faire partie de la simulation. Ceci est important car les mouvements des joueurs doivent souvent être irréalistes tout en restant réalistes face aux collisions.


Configuration du projet

  • Cliquez sur Fichier> Nouveau projet.
  • Accédez au dossier approprié et nommez le projet CannonBowl.
  • Cliquez sur Créer
  • Cliquez sur GameObject> Créer autre> Lumière directionnelle
  • Cliquez sur Fichier> Enregistrer la scène.
  • Nommez la scène Principale
  • Cliquez sur Enregistrer

Collisionneurs

Les collisionneurs sont ce que les moteurs physiques utilisent pour détecter les hits. Contrairement aux objets maillés, ils savent quand ils sont entrés en contact. Ce sont des formes simples, telles que des boîtes, des sphères ou des capsules, attribuées à votre GameObject et suivies de près. Vous pouvez penser à eux comme à un "champ de force".

De manière pratique, chaque fois qu'un GameObject est créé, un collisionneur approprié lui est automatiquement attribué. Un cube obtient un BoxCollider, une Sphère obtient un SphereCollider, un cylindre reçoit un CapsuleCollider, etc..

Nous aurons éventuellement besoin de blocs à abattre:

  • Cliquez sur GameObject> Créer autre> Cube
  • Renommez le cube en Bloc de bois
  • Définissez la position du bloc sur 0, 0, 0. Cela centrera le bloc dans le monde.
  • Télécharger Wood.jpg
  • Faites glisser Wood.jpg dans votre panneau Projet pour en faire une texture.
  • Faites glisser la texture Wood sur le bloc dans la vue de la scène, cela créera automatiquement un matériau Wood et l'appliquera au bloc.
  • Faites glisser le bloc du panneau Hiérarchie vers le panneau Projet pour le transformer en un préfabriqué.

Si nous appuyons sur Play, le bloc ne fera rien. Bien qu'il y ait un collisionneur, il manque un corps rigide, il n'est donc pas affecté par aucune force physique.


Corps rigides

Un corps rigide est l'élément le plus critique dans un moteur physique. Tout GameObject auquel il est attaché est inclus dans la simulation.

  • Sélectionnez le préfabriqué Bloc dans le panneau Projet.
  • Cliquez sur Composant> Physique> Rigidbody

Par défaut, un corps rigide est affecté par la gravité et la résistance de l'air, également appelée traînée. Si nous appuyons sur Play, le bloc commencera à tomber, à accélérer et éventuellement à atteindre la vitesse limite lorsque la force de gravité et la traînée seront égales..


Construire une structure

Nous devrons créer quelques éléments supplémentaires afin de construire un niveau approprié. Premièrement, ajoutons un peu de terrain pour que le bloc ait quelque chose sur lequel atterrir.

  • Cliquez sur GameObject> Créer autre> Plan
  • Renommer l'avion en Sol
  • Réglez la position du sol sur 0, 0, 0
  • Télécharger Grass.jpg
  • Faites glisser Grass.jpg dans votre panneau Projet pour en faire une texture.
  • Faites glisser la texture d'herbe sur le sol dans la vue de la scène

Le Ground recevra automatiquement un MeshCollider qui empêchera tout corps rigide de le traverser. Appuyez sur Play et le bloc devrait tomber et se poser sur le sol.

Nous avons maintenant besoin d’une structure à abattre. Sélectionnez le bloc et appuyez sur Ctrl + D sous Windows ou Cmd + D sous OSX, dupliquer le bloc plusieurs fois. Utilisez l'échelle et les outils de déplacement pour étirer et positionner les blocs dans à peu près la même configuration que celle illustrée ci-dessous..

REMARQUE: C'est une bonne idée d'utiliser des nombres précis pour vos transformations. Les blocs doivent s'appuyer les uns sur les autres, mais ne pas se chevaucher. Les chevauchements vont faire paniquer le moteur physique et faire des choses imprévisibles.


Contrôles de la caméra

Maintenant que nous avons créé notre belle structure, écrivons un script qui nous permettra de déplacer la caméra pour pouvoir admirer notre création sous tous les angles..

  • Cliquez sur Actifs> Créer> Script C #.
  • Renommez le script en Canon (car finalement notre caméra fera le tournage)
  • Faites glisser le script sur la caméra principale
  • Double-cliquez sur le script pour le modifier

Le script suivant fera tourner la caméra autour du centre du monde et l'inclinera de haut en bas:

 Classe publique Cannon: MonoBehaviour void LateUpdate () float x = Input.GetAxis ("Mouse X") * 2; float y = -Input.GetAxis ("Souris Y"); // flotteur vertical inclinable yClamped = transform.eulerAngles.x + y; transform.rotation = Quaternion.Euler (yClamped, transform.eulerAngles.y, transform.eulerAngles.z); // transformation en orbite horizontale. RotateAround (nouveau Vector3 (0, 3, 0), Vector3.up, x); 

Pour terminer, facilitons la visée en ajoutant un réticule à notre appareil photo:

  • Cliquez sur GameObjects> Créer> Plan
  • Renommer l'avion en Réticule
  • Réglez la position du réticule sur 0, 0, 0
  • Télécharger Crosshair.png
  • Faites glisser Crosshair.png dans le panneau Projet.
  • Faites glisser la texture en forme de croix sur le plan en forme de croix dans le panneau Scène
  • Dans l'inspecteur, cliquez avec le bouton droit de la souris sur le composant MeshCollider et supprimez-le pour qu'il n'affecte pas les autres objets de physique de la scène.

Boulets de canon

Etre capable de regarder notre structure, ça va, mais c'est supposé être de la physique! Nous avons besoin d'un moyen de l'abattre pour voir la physique en action. Nous avons besoin de quelque chose à tirer!

  • Cliquez sur GameObject> Créer autre> Sphère
  • Renommez la sphère en Boulet de canon
  • Définir la position du boulet de canon à 0, 0, 0
  • Avec le Cannonball sélectionné, cliquez sur Composants> Physique> Rigidbody
  • Faites glisser Cannonball du panneau Hiérarchie vers le panneau Projet pour le transformer en un préfabriqué.

Puisque nous allons tirer des boulets de canon directement à partir de la caméra, nous pouvons éditer notre script Cannon existant. Tout d'abord, nous ajoutons un attribut public en haut de la classe pour notre préfabriqué projectile.

 public class Cannon: MonoBehaviour public GameObject projectilePrefab;

Nous ajoutons une méthode FixedUpdate pour écouter le bouton «Fire1», puis instancions un préfabriqué Cannonball, le positionnons sur la caméra, puis nous y ajoutons une force pour le faire avancer..

 void FixedUpdate () if (Input.GetButtonDown ("Fire1")) projectile GameObject = Instantiate (projectilePrefab, transform.position, transform.rotation) en tant que GameObject; projectile.rigidbody.AddRelativeForce (nouveau Vector3 (0, 0, 2000)); 

Limites

Vous avez peut-être remarqué que si un boulet de canon est tiré suffisamment loin, il peut tomber du bord de notre avion au sol. Ce boulet de canon continuera d'exister tant que le jeu continuera à fonctionner et sa physique continuera à être calculée, ce qui ralentira éventuellement les choses. Nous devons créer une limite autour du niveau et détruire tous les objets de jeu sortant de cette limite..

  • Cliquez sur GameObject> Créer vide
  • Renommez le en Frontière
  • Définissez les positions x, y et z de la frontière sur 0
  • La frontière étant sélectionnée, cliquez sur Composants> Physique> Box Collider.
  • Dans l'insepctor, assurez-vous que Is Trigger est coché.
  • Réglez le centre du collisionneur sur 0, 25, 0
  • Réglez la taille du collisionneur sur 50, 50, 50

Maintenant, nous devons créer le script qui va détruire et les objets qui sortent de la limite.

  • Cliquez sur Actifs> Créer> Script C #.
  • Renommez le script en Frontière
  • Faites glisser le script sur l'objet Limite dans le panneau Hiérarchie.
  • Editez le script et ajoutez le code suivant
 Classe publique Limite: MonoBehaviour void OnTriggerExit (Collider other) Destroy (other.gameObject); 

Causant la destruction

Nous avons besoin d'un moyen de gagner notre niveau. Pour ce faire, nos blocs doivent être détruits s’ils subissent suffisamment de dommages dus aux impacts.

  • Cliquez sur Actifs> Créer> Script C #.
  • Renommez le script en Bloc
  • Faites glisser le script sur le préfabriqué Bloc dans le panneau Projet.
  • Double-cliquez sur le script dans le panneau Projet pour le modifier.

Dans le script, nous donnons au préfabriqué une propriété publique de santé qui peut être ajustée dans l'éditeur. Cela permet à différents blocs d'avoir différents niveaux de santé.

 classe publique Block: MonoBehaviour public float health = 20;

Lorsqu'une collision est détectée, l'ampleur de l'impact est mesurée. Plus la magnitude est grande, plus les dégâts sont importants. Tout ce qui se situe au-dessus d'un léger robinet est soustrait de la santé du bloc. Si la santé du bloc tombe en dessous de 0, le bloc se détruit lui-même. Il vérifie ensuite le nombre de blocs restants dans la scène. S'il ne reste qu'un bloc, la partie est terminée et la scène est rechargée pour être rejouée..

 void OnCollisionEnter (Collision Collision) // applique des dommages de collision si (collision.relativeVelocity.magnitude> 0.5) health - = collision.relativeVelocity.magnitude;  // détruire si la santé est trop basse si (santé <= 0)  Destroy(gameObject); // restart the scene if this was the last box GameObject[] boxes = GameObject.FindGameObjectsWithTag("Box"); if (boxes.Length <= 1)  Application.LoadLevel("Main");   

Blocs de béton

Jusqu'à présent, nous n'utilisons que des blocs de bois. Ils sont légers et relativement faibles, ce qui rend la structure trop facile à détruire et assez prévisible quant à la façon dont elle va se déplacer. Nous devons créer un autre type de bloc, plus lourd et plus résistant.

  • Dans le panneau Projet, dupliquez le préfabriqué WoodBlock (Ctrl + D sous Windows, Cmd + D sous OSX)
  • Renommez le duplicata en ConcreteBlock
  • Télécharger Concrete.jpg
  • Faites glisser Concrete.jpg dans le panneau Projet.
  • Faites glisser la texture Concrete sur le préfabriqué ConcreteBlock dans le panneau Projet.
  • Avec le préfabriqué sélectionné, utilisez l'inspecteur pour mettre à jour l'intégrité à 50.
  • Dans le composant Rigidbody, augmentez la masse à 5 pour la rendre plus lourde
  • Faites glisser le préfabriqué ConcreteBlock dans la scène

Essayez de remplacer certaines des traverses par des blocs de béton. Les blocs de béton devraient être plus difficiles à renverser, tomber avec un impact important et plus difficiles à détruire avec des boulets de canon.


Jeu fini

Vous trouverez ci-dessous le jeu fini exécuté dans Unity Web Player. Utilisez la souris pour faire tourner la caméra et appuyez sur Ctrl ou le bouton gauche de la souris pour tirer des boulets de canon..




Conclusion

Ce tutoriel ne fait qu'effleurer la surface de ce dont le moteur physique Unity est capable. Forces constantes, forces explosives, matériaux physiques, charnières, ressorts, ragdolls, etc. Bien que cela puisse sembler décourageant, les éléments du moteur physique d'Unity s'emboîtent parfaitement, ce qui facilite la compréhension et l'intégration de la physique dans vos jeux..

Pour en savoir plus sur les fonctionnalités du moteur physique Unity, visitez:

http://docs.unity3d.com/Documentation/Manual/Physics.html