Cette page t’accompagne dans la mise en place de trois énigmes de jeu :
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.
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.
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);
}
}
}
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 :
Voilà, tu peux te lancer maintenant !
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;
}
}
}
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.
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();
}
}