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/

 
 

Enigmes

Cette page t’accompagne dans la mise en place de trois énigmes de jeu : 

  • Enigme Labyrinthe Balle
  • Enigme Téléportation 
  • Enigme Interrupteurs. 

Chacune de ces énigmes propose un défi unique et stimulant pour les joueurs. 

Les mécanismes utilisés dans ces énigmes sont différents et demandent une réflexion spécifique pour être résolus. Ces énigmes peuvent être intégrées dans n’importe quel jeu et sont conçues pour apporter une expérience de jeu enrichissante et divertissante.

A propos de ce guide

Ce guide a été créé avec la dernière version stable de Unity au moment de la rédaction (2021.3.19f)

Enigme Labyrinthe Balle

Le joueur doit guider un objet (par exemple une balle) à travers un labyrinthe jusqu’à une zone d’arrivée définie et détruit l’Obstacle qui bloquait le Joueur. Si la balle touche les murs du labyrinthe, elle revient au point de départ.

Ce script utilise le composant Rigidbody pour gérer le mouvement de la balle, ainsi que la fonction OnCollisionEnter2D pour détecter les collisions avec le joueur, les murs et la zone d’arrivée. 

 Le Script : 

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

 

public class LabyrintheBalle : MonoBehaviour

{

    public Transform depart; // Point de départ de la balle

    private Rigidbody2D rb; // Composant Rigidbody de la balle

 

    void Start()

    {

        rb = GetComponent<Rigidbody2D>(); // Récupérer le composant Rigidbody de la balle

        rb.position = depart.position; // Positionner la balle au point de départ

    }

 

    // Détecter si la balle entre en collision avec un mur

    void OnCollisionEnter2D(Collision2D other)

    {

        if (other.gameObject.CompareTag(« Mur »))

        {

            // Positionner la balle au point de départ

            rb.position = depart.position;

            rb.isKinematic = true; // bloquer le mvt de la Balle

        }

 

        if (other.gameObject.CompareTag(« Player »))

        {

            rb.isKinematic = false;

        }

 

        if (other.gameObject.CompareTag(« Finish »))

        {

            // Détecter si la balle arrive à la zone d’arrivée

            Destroy(other.gameObject);

        }

    }

}

Mise en place dans Unity :

  1. Créer un 2D OBJECT > SPRITES > CIRCLE, ajouter lui un BOX COLLIDER 2D et un RIGIDBODY 2D.
  2.  Configurer le Rigidbody2D ainsi : MASS = 100 / GRAVITY SCALE = 0 / CONSTRAINTS > FREEZE ROTATION cocher le Z.Créer un objet vide pour servir de point de départ de la balle et le positionner dans la scène.
  3. Créer un Mur  2D OBJECT > SPRITES > SQUARE, ajouter lui un BOX COLLIDER 2D et le tag “Mur”.
  4. Créer un (Obstacle qui empêche la progression du Joueur jusqu’à la fin de la salle) 2D OBJECT > SPRITES > ajouter lui un BOX COLLIDER 2D et le tag “Finish”.
  5. Créer un SpawnPoint pour la réapparition de balle, si elle touche un Mur. CREATE EMPTY. Place le au début du Labyrinthe. 
  6. Ajouter le script « LabyrintheBalle » à la balle.
  7. Dans l’inspecteur de la balle, faire glisser le “SpawnPoint” créé précédemment.
  8. Test que la balle réapparaît bien au SpawnPoint si elle touche le Mur avec le tag “Mur” et que la Balle détruit bien l’Obstacle Finish”, que le joueur ne pouvait traverser. Si tout est correct tu peux dupliquer les Murs pour créer ton labyrinthe.
  9. Créer un dossier vide CREATE EMPTY, renomme le en LabyrintheBalle, place tous les éléments de ce mini jeu et glisse ce dossier dans le Préfab.

Enigme Teleportation

Ce script utilise la fonction “OnTriggerEnter2D” pour détecter lorsque le joueur entre en collision avec un objet, le script utilise la fonction transform.position pour déplacer le joueur vers la position prédéfinie dans l’Inspecteur du Script, grâce à la variable publique pour stocker la position d’arrivée.

Cette énigme avec des trous téléporteurs est très simple à mettre en place, je vais te dire ce dont t’as besoin en langage facile : 

  • plusieurs trous qui téléportent (avec le script EnigmeTeleporteur) vers une même salle (qui peut être piégée) 
  • un trou (aussi avec le script EnigmeTeleporteur) qui mène à une bonne salle. Et si tu rajoutes un interrupteur qui désactive la porte, c’est encore plus cool ! 
  • Tu dois aussi mettre un Sprite (avec le script EnigmeTeleporteur) dans chacune des deux salles, celle piégée et celle bonne, pour revenir à la salle principale. 

Voilà, tu peux te lancer maintenant !

 Le Script : 

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

 

public class EnigmeTeleportation : MonoBehaviour

{

    // ou aller

    public Transform Arrivee;

 

    private void OnTriggerEnter2D(Collider2D other)

    {

        if (other.CompareTag(« Player »))

        {

            // Téléporter le joueur dans la salleBonne

            other.gameObject.transform.position = Arrivee.position;

        }

    }

 

}

Mise en place dans Unity :

  1. Ajouter les objets « TrouMauvais » et « TrouBonne » à la scène Ainsi de que le “TrouPrincipale”. Les objets « TrouMauvais » représenteront les trous qui téléportent le joueur dans la salle piégée, tandis que les objets « TrouBonne » représenteront les trous qui téléportent le joueur dans la salle sans piège.
  2. Ajouter les objets « Arrivée dans les salles/endroits voulus » à la scène. Ces objets représentent les arrivées des trous téléporteurs. 
  3. Assurez-vous de placer les Arrivées des téléporteurs dans chaque salle, y compris la salle principale.
  4. Ajouter des murs pour séparer les différentes salles et éloigner les unes des autres (pas comme dans mon exemple).
  5. Ajouter l’interrupteur pour ouvrir la porte ou un trésor dans la bonne salle.
  6. Ajouter des pièges dans la salle piégée.
  7. Créer un script « EnigmeTeleportation » pour gérer le comportement des téléporteurs. Ce script permettra de téléporter le joueur vers la bonne ou la mauvaise salle en fonction du trou dans lequel il tombe.
  8. Attacher le script « EnigmeTeleportation » à chaque téléporteur dans la scène et indiquer son sprite d’arrivée..
  9. Tester la scène pour vous assurer que tout fonctionne correctement

Enigme Interrupteurs

Ce script gère une énigme d’interrupteurs où le joueur doit activer les interrupteurs dans une séquence spécifique pour déclencher une action (ex : désactiver une porte, etc.). 

Ce script utilise une série de if pour contrôler l’ordre des boutons, lesquels doivent être activés, et désactivés

Pour faire fonctionner cette énigme on aura besoin d’un script: boutonEnigme

Note : Il est recommandé de fournir des indices au joueur afin qu’il puisse résoudre l’énigme, comme par exemple utiliser l’ordre des interrupteurs pour former la première lettre du nom du boss final du donjon.

 Le Script : 

Ce script est associé aux interrupteurs pour cette énigme. Lorsque le Player touche un interrupteur, la fonction OnTriggerEnter2D est appelée. Cette fonction vérifie si le tag de l’objet entré en collision est bien « Player », et si c’est le cas, procède aux vérifications.
 
En fonction du bouton (premier bouton, dernier bouton, etc) le script vérifie la présence d’un bouton précédent, d’un objet à activer et gère l’aspect visuel de l’activation du bouton
 

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

 

public class boutonEnigme : MonoBehaviour

{

    public boutonEnigme boutonPrecedent;

    public GameObject objet_a_changer;

    public bool change_objet;

 

    bool actif;

 

    public Color color;

    Color color_initiale;

 

    private void Start() {

        color_initiale = GetComponent<SpriteRenderer>().color;

         if(objet_a_changer){

            objet_a_changer.SetActive(change_objet);

         }

    }

 

    private void Update() {

        if(actif){

            GetComponent<SpriteRenderer>().color = color;

        }else{

            GetComponent<SpriteRenderer>().color = color_initiale;

        }

    }

 

    // Update is called once per frame

    void OnTriggerEnter2D(Collider2D objet)

    {

        if(objet.transform.tag == « Player ») //si c’est le joueur qui touche le bouton

        {

            if(boutonPrecedent)//si ce bouton n’est pas le premier, qu’il en avait un autre avant

            {

                if(boutonPrecedent.actif)//si le bouton precedent est bien activé

                {

                    actif = true;   //ce bouton s’active

                    if(objet_a_changer){ //si ce bouton contient l’objet à changer c’est le dernier bouton donc quand on l’active

                        change_objet = !change_objet; //on change l’etat de l’objet. Si il était actif il devient inactif

                        objet_a_changer.SetActive(change_objet); //et on applique le changement sur l’objet

                        Destroy(this,0.5f); //on désactive le script final avec un petit timer

                    }

                }else{       //sinon si le bouton precedent n’est pas activé

                    actif = false; //ce bouton se désactive

                    DesactiveBoutonPrecedent(); //et lance la désactivation en chaine de tous les boutons

                }

            }else{

                actif = true;

            }

        }

    }

 

    void DesactiveBoutonPrecedent()

    {

        boutonPrecedent.actif = false;

        boutonPrecedent.DesactiveBoutonPrecedent();

    }

 

}

Mise en place dans Unity :

  1. Créer des GameObjects pour représenter les interrupteurs et les placer dans la scène.
  2. Ajouter un Collider 2D en IsTrigger à chaque interrupteur pour détecter les collisions avec le joueur. Donne aussi à chacun le Script “boutonEnigme”
  3. Attribuer les boutons précédents dans l’ordre et l’objet à activer au dernier bouton
  4. Exécuter le jeu pour tester le fonctionnement de l’énigme.