Cette page t’accompagne dans la mise en place de différents systèmes qui peuvent servir d’Ennemi ou de tout autre obstacle, dans un Donjon ou pas, tu es très libre d’adaptation !
Le premier script permet de faire bouger un objet d’un point A à un point B en suivant une liste de destinations. (On peut ajuster la vitesse et décider si l’objet doit repartir à la première destination une fois la dernière atteinte.)
Le deuxième script permet de faire tourner un objet sur lui-même à une vitesse constante.
Le troisième script permet de faire tourner un objet autour d’un point pivot à une vitesse constante.
Le quatrième script permet de faire clignoter un objet en alternant son apparence (visible/invisible) à intervalles réguliers, comme pour créer un piège qui s’active et se désactive.
Ce guide a été créé avec la dernière version stable de Unity au moment de la rédaction (2021.3.19f)
Ce script permet de faire patrouiller un objet (en suivant une liste de destinations) et peut être utilisé par exemple pour faire bouger un ennemi de manière prévisible.
using UnityEngine;
public class TrapPatrouille : MonoBehaviour
{
// Variables publiques
public float vitesse = 1f; // vitesse de déplacement
public List<GameObject> destinations; // les destinations à suivre
public bool boucle = true; // si true, le chemin est bouclé, sinon l’objet s’arrête une fois arrivé au bout du chemin
// Variables privées
private int indiceDestination = 0; // indice de la destination courante dans la liste
private float tolerance = 0.1f; // la distance acceptable pour considérer que l’objet a atteint une destination
void Update()
{
// déplacer l’objet vers la destination suivante
transform.position = Vector2.MoveTowards(transform.position, destinations[indiceDestination].transform.position, vitesse * Time.deltaTime);
// si l’objet atteint la destination
if (Vector2.Distance(transform.position, destinations[indiceDestination].transform.position) < tolerance)
{
indiceDestination++; // passer à la destination suivante
if (indiceDestination >= destinations.Count) // si la dernière destination est atteinte
{
if (boucle)
{
indiceDestination = 0; // boucler sur la première destination
}
else
{
enabled = false; // désactiver le script
return;
}
}
}
}
}
Ce code fait bouger un objet. Il se déplace de manière automatique d’un point A à un point B en suivant un chemin qui est défini par une liste de destinations.
Le code définit plusieurs paramètres pour contrôler le mouvement de l’objet, tels que la vitesse de déplacement, si l’objet doit boucler ou s’arrêter une fois qu’il atteint la dernière destination, et la tolérance de distance pour considérer que l’objet a atteint une destination.
À chaque fois que l’objet atteint une destination, le code passe à la destination suivante jusqu’à ce que toutes les destinations soient atteintes. Si l’objet doit boucler, l’objet revient à la première destination une fois qu’il a atteint la dernière et s’arrête.
Note : Il est possible de déclencher le début du mouvement de l’objet à un moment précis (quand on touche un objet par exemple) pour créer une petite animation et un Objet qui s’enfuit à l’approche du Joueur. Si on désactive la boucle, l’objet s’arrêtera une fois qu’il aura atteint la dernière destination.
5. Et glisser depuis la fenêtre Hierarchy vers la liste de destinations dans la fenêtre Inspector les CREATE EMPTY.
6. Créer un nouveau CREATE EMPTY (pour en faire un dossier), donne lui un nom Significatif, glisse le GameObject et les CREATE EMPTY de destination, et glisse ce dossier dans les Prefab, pour pouvoir réutiliser facilement ! 😀
Ce script permet de faire tourner un objet en continu autour de lui-même, comme une toupie.
using UnityEngine;
public class Rotation : MonoBehaviour
{
public float rotationSpeed = 10f;
private void Update()
{
transform.Rotate(0f, 0f, rotationSpeed * Time.deltaTime);
}
}
La variable « rotationSpeed » définit la vitesse de rotation de l’objet en degrés par seconde.
Dans la méthode « Update », la fonction « Rotate » est appelée sur l’objet lui-même (ici, « transform ») pour effectuer la rotation selon l’axe Z (0f, 0f, z), avec une vitesse de rotation en fonction du temps écoulé depuis la dernière frame (Time.deltaTime).
Ainsi, à chaque frame, l’objet tourne d’un certain angle en fonction de la vitesse de rotation définie dans « rotationSpeed ».
Pour que ce script fonctionne, il faut l’attacher à l’objet que l’on souhaite faire tourner en continu, en le faisant glisser-déposer dans la scène Unity ou en sélectionnant l’objet puis en cliquant sur « Add Component » et en choisissant « Rotation » dans la liste des scripts disponibles.
Pour que le script fonctionne, il faut dans Unity :
Ce script permet de faire tourner un objet autour d’un point pivot à une vitesse définie.
using UnityEngine;
public class TourneAuTour : MonoBehaviour
{
public Transform pivot; // Le point pivot autour duquel on veut orbiter
public float orbitSpeed = 10f; // La vitesse de l’orbite
private void Update()
{
// Fait tourner le GameObject autour du point pivot en utilisant l’axe vertical (Y) comme axe de rotation
// Le deuxième argument, Vector3.up, correspond à l’axe de rotation
// Le troisième argument, orbitSpeed * Time.deltaTime, correspond à la vitesse de rotation
transform.RotateAround(pivot.position, Vector3.forward, orbitSpeed * Time.deltaTime);
}
}
Ce script permet de faire tourner un objet autour d’un point pivot en utilisant l’axe vertical (Y) comme axe de rotation.
Le point pivot est défini par la variable « pivot », et la vitesse de rotation est définie par la variable « orbitSpeed ». Le mouvement de rotation est effectué dans la méthode « Update ».
Pour que le script fonctionne, il faut dans Unity :
Le script permet de faire clignoter des objets à intervalles réguliers.
Ce script désactive tous les objets enfants de l’Objet parent qui porte le Script. Dans la méthode Start() pour s’assurer qu’ils sont tous désactivés au lancement du jeu.
La méthode Update() active et désactive ensuite tous les objets enfants en alternance selon la valeur de isActive.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Clignoteur : MonoBehaviour
{
public int dureeClignotement = 1;
private float timer = 0f;
private bool isActive = false;
private void Start()
{
// Désactiver tous les objets enfants du gameObject porteur du script
foreach (Transform child in transform)
{
child.gameObject.SetActive(false);
}
}
void Update()
{
timer += Time.deltaTime;
if (timer >= dureeClignotement)
{
isActive = !isActive;
foreach (Transform child in transform)
{
child.gameObject.SetActive(isActive);
}
timer = 0f;
}
}
}