Unity - Roguelike 2D

Script des ennemis

L'auteur

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

Le projet présenté dans cette série est tout aussi bien compatible avec Unity 4.6 qu'avec Unity 5.
Vous pouvez retrouver les autres épisodes de cette série dans le sommaire dédié.

II. Vidéo


Unity - Roguelike 2D - Script des ennemis


III. Résumé

Dans ce chapitre, nous créons le script des ennemis.

III-A. Enemy.cs

Les ennemis héritent de MovingObject afin de permettre à ceux-ci de se déplacer dans le jeu tout en suivant les règles vues dans le chapitre sur les déplacements.

III-A-1. Fonctionnalités

Les ennemis enlèvent de la nourriture au joueur et cherchent à se déplacer dans sa direction. Ceux-ci ne peuvent se déplacer qu'un tour sur deux.

III-A-2. Script

 
Sélectionnez
using UnityEngine;
using System.Collections;

namespace Completed
{
    // Enemy hérite de MovingObject, notre classe de base pour les objets mobiles. La classe Player hérite aussi de cette classe.
    public class Enemy : MovingObject
    {
        public int playerDamage;                            // Le nombre de points à enlever au joueur lors d'une attaque.
        
        
        private Animator animator;                          // Variable de type Animator pour garder une référence vers le composant Animator de l'ennemi.
        private Transform target;                           // Déplacement vers lequel on essaie d'aller à chaque tour. 
        private bool skipMove;                              // Booléen pour déterminer si l'ennemi doit passer son tour ou se déplacer.
        
        
        // La fonction Start surcharge la fonction virtuelle Start de la classe de base.
        protected override void Start ()
        {
            // Enregistre cet ennemi à l'instance de GameManager en l'ajoutant à la liste des ennemis. 
            // Cela permet au GameManager de faire les commandes de déplacement.
            GameManager.instance.AddEnemyToList (this);
            
            // Récupère et stocke une référence sur le composant Animator.
            animator = GetComponent<Animator> ();
            
            // Trouve le GameObject Player en utilisant son tag et stocke une référence de son composant Transform.
            target = GameObject.FindGameObjectWithTag ("Player").transform;
            
            // Appelle la fonction Start de la classe de base.
            base.Start ();
        }
        
        
        // Surcharge la fonction AttemptMove de la classe MovingObject pour intégrer la particularité de Enemy à sauter des tours.
        // Voir les commentaires de MovingObject pour plus d'informations sur le fonctionnement de la fonction AttemptMove.
        protected override void AttemptMove <T> (int xDir, int yDir)
        {
            // Vérifie si skipMove est à true. Dans ce cas, le mettre à false et sauter le tour.
            if(skipMove)
            {
                skipMove = false;
                return;
                
            }
            
            // Appelle la fonction AttemptMove de la classe de base.
            base.AttemptMove <T> (xDir, yDir);
            
            // Maintenant que l'ennemi s'est déplacé, définit skipMove à true pour sauter le prochain tour.
            skipMove = true;
        }
        
        
        // La fonction MoveEnemy est appelée par le GameManger chaque tour pour indiquer à chaque ennemi d'essayer de se déplacer vers le joueur.
        public void MoveEnemy ()
        {
            // Déclare les variables pour les directions X et Y. Leur valeur varie entre -1 et 1.
            // Ces valeurs nous permettent de choisir parmi les directions cardinales : haut, bas, gauche et droite.
            int xDir = 0;
            int yDir = 0;
            
            // Si la différence de position est proche de zéro (Epsilon) faire ce qui suit :
            if(Mathf.Abs (target.position.x - transform.position.x) < float.Epsilon)
                
                // Si la coordonnée Y de la cible (joueur) est plus grande que la coordonnée Y de cet ennemi, alors la direction en Y est 1 (pour se déplacer vers le haut). Sinon, c'est -1 (pour se déplacer vers le bas).
                yDir = target.position.y > transform.position.y ? 1 : -1;
            
            // Si la différence de position est proche de zéro (Epsilon) faire ce qui suit :
            else
                // Vérifie si la coordonnée X de la cible et plus grande que celle de cet ennemi. Dans ce cas, définit la direction en X à 1 (pour se déplacer vers la droite), sinon c'est -1 (pour se déplacer vers la gauche).
                xDir = target.position.x > transform.position.x ? 1 : -1;
            
            // Appelle la fonction AttemptMove en lui passant le paramètre générique Player, car Enemy se déplace et espère rencontrer un Player
            AttemptMove <Player> (xDir, yDir);
        }
        
        
        // La fonction OnCantMove est appelée si Enemy essaie de se déplacer vers un espace occupé par un Player. Surcharge la fonction OnCantMove de la classe MovingObject 
        //et prend un paramètre générique T par lequel nous passons le composant que nous souhaitons rencontrer, dans ce cas, le joueur.
        protected override void OnCantMove <T> (T component)
        {
            // Déclare hitPlayer et le définit à la valeur du composant rencontré.
            Player hitPlayer = component as Player;
            
            // Appelle la fonction LoseFood en lui passant playerDamage, le nombre de points de nourriture à enlever.
            hitPlayer.LoseFood (playerDamage);
            
            // Définit le déclencheur de l'attaque de l'animator pour démarrer l'animation d'attaque.
            animator.SetTrigger ("enemyAttack");

        }
    }
}

IV. Ressources

Vous pouvez télécharger les ressources pour ce projet sur l'Asset Store de Unity.

V. Commenter

Vous pouvez commenter et donner vos avis dans la discussion associée sur le forum.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2015 Unity Technologies. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.