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..
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.
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:
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.
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.
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..
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.
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.
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..
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:
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!
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));
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..
Maintenant, nous devons créer le script qui va détruire et les objets qui sortent de la limite.
Classe publique Limite: MonoBehaviour void OnTriggerExit (Collider other) Destroy (other.gameObject);
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.
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");
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.
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.
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..
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