Ressources Magic Makers

 

Site en maintenance

 
Nous sommes actuellement entrain de mettre à jour les ressources de ce site.
Pendant la mise à jour vous pouvez retrouver tous les nouveaux contenus sur le site
 

https://lp-magicmakers.fr/

 
 

UNITY - Éléments de Jeux

Les différents scripts

Sur cette page tu peux découvrir comment :

    • Créer un portail de téléportation et comment bien voir des objets invisibles
    • Faire tourner des objets sur eux mêmes ou autour d’autres objets
    • Faire faire des aller retours à des objets
    • Déplacer le personnage en même temps qu’un autre objet et qu’est ce que la parenté dans Unity
    • Activer ou désactiver un objet, et le faire régulièrement dans le temps
    • Activer ou désactiver un script
 

Portail de téléportation

Déplacements et changements de position

Pour changer la position d’un objet, il suffit de modifier la position de son transform. Pour cela on modifie la variable transform.position de l’objet. 

Vidéo tuto

Tu peux regarder cette vidéo tuto qui présente Création d’un script pour un système de téléportation ! 

Tu trouveras ci-dessous le tuto écrit du mécanisme de jeu.

Principe du script

Voici un petit exemple de portail de téléportation qui téléporte le joueur vers un autre endroit. Dans ce script nous utiliserons les mécanismes de collision (plus d’explications sur cette page)

Lorsque le joueur rentre en collision avec un objet, le joueur est immédiatement téléporté à un autre endroit.

Pour ça on a besoin de la position d’arrivée pour y déplacer le joueur. Pour récupérer cette position, on utilise une variable publique arrivée qui contient l’objet où l’on veut faire arriver le joueur.

Pour accéder à la position à partir d’un objet il suffit d’écrire : objet.transform.position.

On peut s’inspirer de ce script pour en faire plein d’autres : déplacer un objet si on en touche un autre, créer des killzone, faire évoluer une position au cours du temps, faire faire des aller-retours à des objets…

Voir une arrivé invisible (Gizmos)

Si l’on souhaite que l’objet d’arrivée soit invisible on peut créer un objet vide (Empty Game Object) et utiliser les Gizmos pour avoir un marqueur de position visible dans l’éditeur mais invisible dans le jeu. Pour activer cela il suffit d’aller dans l’inspecteur à côté du nom de l’objet.

On peut alors choisir la forme et la couleur d’un petit symbole qui nous permettra de repérer cet objet vide.

Faire tourner des objets

Rotations, Update et Time.deltaTime

Les rotations sont utiles pour avoir des environnements qui bougent, faire tourner des objets sur eux-mêmes ou autour d’un centre, ouvrir une porte, faire des orbes de protection…

Pour gérer la rotation d’un objet on va s’intéresser à son Transform

Vidéo tuto Faire tourner un gameobject

Vido tuto qui présente la création d’un script pour créer des plateformes qui tournent !

Tourner sur lui même (Rotate)

Pour faire tourner un objet sur lui même on peut utiliser la fonction transform.Rotate( Vector3 anglesRotation). Lorsque cette fonction est appelée, elle fera tourner l’objet une fois dans l’angle indiqué sur chacun des axes. Le point d’origine de ces axes est le centre de l’objet. 

Par exemple en utilisant la fonction Update on peut tourner à chaque frame de 5° atour de l’axe X

On peut créer une variable publique pour changer plus facilement la rotation depuis l’interface d’Unity.

Enfin la fonction Update est appelée à chaque Frame. Mais, selon la puissance des ordinateurs, il n’y a pas autant de Frame par seconde. Pour s’assurer que la vitesse de rotation soit la même sur tous les ordinateurs, on va multiplier l’angle par le temps écoulé depuis la dernière frame grâce à la variable Time.deltaTime.

Si l’on souhaite faire tourner une seule fois l’objet dans une position particulière, alors on n’as pas besoin de s’occuper du temps ni de rajouter le Time.deltaTime.

Tourner autour d’un autre objet (RotateAround)

Pour faire tourner un objet autour d’un autre nous allons utiliser la fonction transform.RotateAround( Vector3 centre, Vector3 Axe, float angle) :

  • Le centre de rotation est l’objet autour duquel on veut faire tourner l’objet. On peut facilement récupérer la position d’un objet grâce à son transform et à une variable publique.
  • L’axe permet de dire comment tourner autour du centre. Par exemple avec un axe (0,1,0), l’objet tournera autour de l’axe Y.
  • L’angle permet de régler la vitesse de rotation en précisant de combien de degré l’objet doit bouger. On pense à le multiplier par le temps passé depuis la dernière Update.

Faire des aller retours

Animation, Déplacement, Collider et Trigger

Vidéo tuto de A à Z

Tu peux regarder cette vidéo tuto qui présente la création d’une plateforme qui bouge (aller-retour) et la programmation nécessaire pour que le joueur suive la plateforme  ! 

Tu trouveras ci-dessous le tuto écrit pour réaliser le mécanisme de jeu d’une autre manière pour la partie aller-retour et encore en-dessous le code pour que le joueur suive la plateforme.

Sinus, Déplacement, Update et Time.Time

Pour faire des aller-retours allons utiliser la fonction mathématique sinus qui ressemble à ça.

Elle permet de récupérer une valeur qui évolue régulièrement entre -1 et 1 au cours du temps.

Principe du script

A chaque frame on déplace légèrement notre objet en récupérant la valeur du sinus et en ajoutant cette valeur à la position initiale de notre objet pour le faire bouger.

Pour mémoriser la position initiale, on la stocke dans une variable de type Vector3 pour pouvoir la réutiliser à tout moment. Pour cela on crée une variable, et on récupère sa valeur dans la fonction Start().

Pour récupérer le sinus on va utiliser la fonction Mathf.Sin(float temps). Pour récupérer le temps réel on a la fonction Time.time.

Pour choisir l’axe de déplacement, on crée également une variable publique de type Vector3.

La variable direction permet aussi de gérer à quel point le mouvement sera important sur les différents axes. 

On peut également gérer la vitesse de déplacement en modifiant la fréquence de notre sinus à l’aide d’une variable publique.

Bouger avec les plateformes

Changer de parent, Collider et Trigger

Quand on a des plateformes qui bougent, on peut vouloir que le personnage se déplace en même temps que celle-ci. Pour cela on va utiliser la notion de parenté.

La parenté dans Unity

Dans l’interface Unity quand on crée des objets, on peut les mettre les uns dans les autres.

Par exemple ci dessous on a un objet plateforme qui bouge qui contient l’objet plateforme solide. On dit que plateforme qui bouge est le parent et plateforme solide est l’enfant.

Quand un objet parent se déplace, tous ses enfants se déplacent de la même manière que lui.

Principe du Script

Pour que le joueur bouge avec la plateforme, tant qu’il est sur celle-ci, on va faire en sorte que le joueur soit enfant de la plateforme qui bouge. Pour cela on a la variable transform.parent.

On peut utiliser les fonctions OnTriggerEnter pour détecter le début de la collision et OnTriggerExit pour détecter la fin de la collision.

Remarque : ce script est prévu pour être sur la plateforme qui bouge et pas le joueur.

On a deux étapes dans ce script :

    1. Quand le joueur entre en collision avec un objet, cet objet devient parent du joueur
    2. Quand le joueur sort de la collision on réinitialise son parent
Étape 1
Étape 2

Collider et Trigger - que faire quand on a besoin des deux ?

Pour que notre script fonctionne il faut que le collider de l’objet soit en mode Trigger. Cependant en mettant le collider en mode Trigger, l’objet n’est plus solide et le joueur passe à travers. 

On va donc avoir besoin de 2 objets différents :

    • un objet en mode Trigger qui bouge qui sera parent du joueur et de la plateforme solide
    • un objet en mode Collider enfant de l’objet en mode Trigger qui servira pour se poser dessus. Étant lui-même enfant de l’objet qui bouge, il bougera aussi avec lui.

Voici les différentes étapes pour faire ça facilement :

    1. Créer la plateforme solide ou le joueur se posera avec un collider.
    2. Créer un objet vide dans cette plateforme et le renommer (BoiteQuiBouge dans l’exemple)
    3. Ajouter un Collider à cet objet vide. Le collider prend alors directement la forme de l’objet parent.
    4. Passer le Collider de l’objet vide en IsTrigger
    5. Inverser la parenté (voir schéma à côté)
    6. Mettre les scripts de mouvement et le script devenirParent sur la boite qui bouge
    7. Vérifier que le joueur a bien le tag Player
    8. Pour être sûr que la collision soit bien détectée on peut agrandir le collider de la boite pour qu’elle soit un peu plus grande que la plateforme elle même.
Étape 8
Étape 8 : le collider de la boite dépasse de la plateforme
Étape 2
Étape 2 : Créer un objet vide
Étape 5
Étape 5a : état intial
Étape 5b : sortir la Boite qui bouge
Étape 5c : mettre la plateforme dans la Boite

Activer et désactiver un objet

SetActive, InvokeRepeating et créer ses propres fonctions

On peut vouloir activer ou désactiver des objets pour différentes raisons : la porte n’apparaît qu’une fois les conditions de victoires remplies, quand on récupère un objet cela en fait apparaître un autre, les objets apparaissent au bout d’un certain temps puis disparaissent pendant un temps, un message apparaît quand on est suffisamment près d’un objet… 

Attention : Ce n’est pas la même chose que créer un nouvel objet (voir création de balle) : ici l’objet est déjà sur la scène et reste présent et on le rend visible ou non. Ce n’est pas non plus comme désactiver un script (voir ci-dessous), là c’est tout l’objet qui est désactivé.

Principe du script

Dans l’inspecteur Unity on peut facilement activer ou désactiver un objet :

Objet activé
Objet désactivé

Dans le code, on peut gérer cela avec la fonction SetActive(). Par exemple, quand le jeu se lance on désactive l’objet et lorsque l’on rentre en collision avec un autre objet celui-ci s’active.

Attention lorsqu’un objet est inactif aucun de ces scripts ne fonctionnent, il faut impérativement avoir un script sur un autre objet pour réactiver l’objet.

Faire apparaître un objet régulièrement

On peut vouloir que toutes les X secondes l’objet s’active ou se désactive. Pour cela on peut utiliser la fonction InvokeRepeating() qui appelle une autre fonction de manière répétée.

Nous allons commencer par créer une fonction qui change l’activation d’un objet.

Le mot void permet d’indiquer qu’on crée une fonction, ChangerEtat est le nom de la fonction et on écrira le code de cette fonction entre les accolades { }

On veut que cette fonction change l’activation de l’objet : s’il est activé on le désactive, sinon on l’active. Pour savoir si l’objet est activé ou utilise la variable activeSelf.

Enfin on utilise la fonction InvokeRepeating() pour appeler cette fonction de manière répétée. Cette fonction prends trois paramètres :

  • le nom de la fonction à appeler
  • le temps à attendre avant d’appeler la fonction pour la première fois
  • le temps à attendre ensuite entre chaque appel

On peut utiliser des variables publiques pour gérer cela directement dans l’interface Unity.

Attention encore une fois ce script ne peut pas être sur l’objet que l’on veut activer et désactiver. Il peut être utile de créer un objet vide qui gèrera l’activation et la désactivation des objets qui s’activent périodiquement au cours du temps.

Activer un script ou un composant

Enabled, Update et Input

Pour créer certains boost  permanents ou encore débloquer des pouvoirs à des moments particuliers on peut vouloir activer ou désactiver certains composants. Par exemple, ici on va voir ce mécanisme pour pouvoir allumer ou éteindre une lumière avec la touche O.

Attention ici on active uniquement un script, une partie d’un objet, si tu veux désactiver tout l’objet tu peux regarder juste au dessus.

Principe du script

On récupère un script depuis l’interface de Unity avec une variable publique et quand on appuie sur une touche on l’active ou le désactive.

Pour l’exemple notre composant sera de type Light, on crée donc une variable de ce type. Pour ton script, utilise le type du composant de ton choix.

Ensuite on va vérifier si l’on appuie sur la touche choisie avec la fonction Input.GetKeyDown().

Tu peux aussi utiliser des collisions ou d’autres systèmes d’input selon tes envies.

Quand la touche est pressée on vérifie si la lumière est allumée, si elle est allumée alors on l’éteint sinon on l’allume.

On utilise la propriété enabled qui vaut vrai si le composant est activé et faux sinon.

 Une autre méthode consiste à utiliser l’opérateur non ! qui inverse la valeur d’un booléen.