Premiers pas avec Unity3D : "open a door" (part II)



Pendant ce TP vous allez réaliser un "jeu" simple permettant à un joueur d'ouvrir (ou non) une porte sur un clic de souris.
Pour voir le résultat escompté vous pouvez voir un exemple du JEU en cliquant sur le lien ou dans la fenetre ci-contre
CLIQUEZ POUR VOIR LE JEU !!!
LE JEU
Plus précisément, ce TP devrait vous permettre :
Ce TP fait suite à "open a door (part I)" ou l'animation de la porte est réalisé à l'aide de script C# mais sans faire appel au moteur physique de Unity.
Ce TP devrait vous permettre de comprendre :

Les joints sont très utilisés dans les jeux et pas seulement pour ouvrir des portes !
Une vidéo -un peu longue (30min) présente de nombreuses utilisation des hingeJoints dans Unity.
Une autre plus courte (3min) montre comment faire osciller la tête d'un personnage.

Open a door (part I). <
    Open a door (part II) : Physics and Hinge Joint                                                        >
Open a door (part III)



Step 1 : Une porte "physique"

La porte définie dans la partie I est purement géométrique. Les interactions avec la souris (OnMouse) utilisent le Collider de chaque objet géométrique. Nous allons maintenant créer une porte qui réagit au contraintes du monde physique (à la gravité du moins).

 
Pour faire de la physique il faut associer un Rigidbody à l'objet à l'aide de "Add Component".

Creez une porte simple (cube), associez un Rigidbody et vérifiez que la porte tombe dans le mode Game.
Les champs du composant RigidBody sont expliqués dans l'onglet associé : le petit livre [?].


Vous pouvez la maintenir en l'air en désactivant "use gravity" ou alors ajouter un sol (sans Rigidbody) sur lequel elle va reposer. Notez que la "chute" n'est pas très réaliste et que les paramètres du RigidBody n'y font rien.





Step 2 : Ajouter une force à la souris

Un simple script C# va nous permettre d'appliquer une force à la porte (pour l'ouvrir) sur un simple clic de souris pour l'exemple.

Le composant Rigidbody associé à l'objet peut être réccupéré dans le script simplement avec la fonction "GetComponent" comme dans l'exemple ci-dessous :
   private Rigidbody rb;
   rb = GetComponent<Rigidbody>();
La force ne sera appliquée que si le bouton de la souris est pressé
  void OnMouseDown(){...
        rb.AddForce(Fvector, ForceMode);
  }
Avec
  Fvector = forceDirection * forceAmount;
forceAmount pourrait être une variable publique pour être facilement modifiée :
  public float forceAmount;
Pour commencer :
forceDirection sera fixée à  transform.forward.
ForceMode sera fixée à  ForceMode.Acceleration (qui ignore la masse de l'object auquel elle est appliquée)

Ecrivez le script que vous appliquerez à la porte. Passez en mode Game pour vérifier que la force s'applique correctement. Si c'est le cas, la porte devrait tomber à plat au premier clic. Tombe t-elle du "bon" côté ? Pouquoi ?

Extensions et réflexions :
Supposons que la vue soit "à la première personne". La caméra donne alors la position et l'orientation du joueur ; elle permet de connaitre la direction de la force "appliquée" par la souris.

  Matrix4x4 m = Camera.main.cameraToWorldMatrix;
  Vector3 forceDirection = m.MultiplyPoint(new Vector3(0, 0, X));

Que mettre en X pour que la porte tomber à plat du "bon" côté ?
Augmenter la force avec la durée d'enfoncement de la souris...

Step 3 : Les joints  

Pour que la porte tourne autour de sa charnière il faut bloquer certains degrés de liberté. Nous allons lui associer un  hingeJoint.

La documentation en ligne s'obtient simplement en cliquant sur le petit livre [?] à droite du composant. Ci-dessous quelques explications succinctes des principaux paramètres pour l'utilisation présente :
  • Axis : est évidement l'axe de rotation (Y est vers la haut ATTENTION)
  • Use Spring :  c'est le ressort de rappel (un ferme-porte ou groom dans notre exemple)
    • Spring : "force" de rappel (qui peut même empécher la porte de s'ouvrir !),
    • Damper : amortissement du mouvement de  rappel (frottement?),
    • Target position : angle pour la position de repos de la porte (ici 0 degré)
  • Limits : de rotation autour de la position au repos (ici de -100 à 100 degrés)
    • Bounciness : rebond de la porte quand on atteint les limites,
    • ...
Le meilleur moyen de ressentir l'effet des paramètres est de le tester les différentes valeurs (en mode Game) tout simplement.







Et pour aller plus loin avec les joints  

Les joints sont très utilisés dans les jeux et pas seulement pour ouvrir des portes !
Une vidéo -un peu longue (30min) présente de nombreuses utilisation des joints dans Unity.
Une autre plus courte (3min) montre comment faire osciller la tête d'un personnage.

other hingejoint applications

Open a door (part I). <
    Open a door (part II) : Physics and Hinge Joint                                                        >
Open a door (part III).