Tutoriel N°2 – Partie 3 : Système de spawn et coffre

Bonjour à tous. Comme prévu, voici la 3e partie du tutoriel sur la création d’un générateur de labyrinthe avec Unity 3D. Cette dernière partie est consacrée à la création d’un système de spawn pour faire apparaître le joueur et des objets

Commencez par télécharger ce modèle 3D : Coffre 3D
Lors de ce tutoriel, nous utiliserons un coffre que j’ai créé sur Cinema4D.

Une fois téléchargé, ouvrez votre projet et glissez le modèle 3D dans Unity pour l’importer dans le projet.

Encadré en rouge les fichiers qui apparaissent une fois l’importation terminée.

N’hésitez pas à créer un dossier pour les modèles 3D pour organiser votre projet.

Commençons par configurer notre modèle 3D. Cliquez sur le coffre.
Dans l’onglet « Model » changez le « Scale Factor » de l’objet à 0.5 puis cliquez sur Apply.
Dans l’onglet « Rig » changez le type d’animation en « Legacy » puis dans « Generation » choisissez « Store in Root (New) » puis cliquez encore sur Apply pour sauvegarder.
Dans l’onglet « Animations », renommez l’animation en « OpenClose » et cliquez sur Apply.

Voici ce que vous devriez avoir sous les yeux.

Nous allons maintenant, créer le préfab du coffre, pour cela glissez le coffre dans la scène puis centrez-vous sur lui.
Ajoutez le composant « Box Collider », puis faite en sorte que le collider englobe le coffre, et qu’il soit assez grand pour empêcher le futur joueur de sauter dessus par exemple.

Maintenant que notre coffre possède sa boite de collision, glissez le coffre de notre scène vers le panneau « Project » pour créer son préfab automatiquement. Puis supprimer le coffre de la scène.
Notre préfab est maintenant terminer.
Concernant le joueur, je vous invite à utiliser le pack « Characters » qui fait partie des Standard Assets d’Unity.
Importez-le à partir de l’onglet Assets > Import Package > Characters. Pour ce tutoriel, nous allons utiliser le FirstPersonCharacter.

Et enfin, nous aurons besoin d’un dernier préfab, le spawn.
Créez simplement un nouveau GameObject vide dans la scène. Mettez-le en position 0 dans les 3 axes, glissez-le pour créer son préfab et supprimez-le de la scène.

Nos 3 préfabs sont maintenant créer, passons à la partie script.

Nous allons d’abord modifier le script « MazeGenerator » pour qu’il puisse prendre en compte notre préfab de spawn et créer une liste de spawn lors de la génération du labyrinthe.
L’idée est que quand le labyrinthe créé une cellule sans issue (cul-de-sac), le script instancie un prefab du spawn.

Juste en dessous de la liste des voisins créer lors du précèdent tutoriel. Déclarez trois variables publiques.
Un « Transform » pour notre préfab qui sert de spawn, une liste de « Transform » qui contiendra tous les spawns que le labyrinthe possèdera et un offset pour placer correctement le coffre.
Nous initialisons maintenant notre liste de « Transform » dans la méthode « Start ».

	/* Script MazeGenerator */
	
	/* SPAWNER */
	public Transform spawnerPrefab; // Préfab du spawner.
	public List<Transform> spawnList; // Liste de nos spawns dans le labyrinthe.
	private float offset = 0.4f; // Offset du spawn dans la cellule.
	
	void Start ()
    {
        cells = new Cell[_width, _height]; // Initialisation du tableau de cellules.

		spawnList = new List<Transform>(); // Initialisation de la liste de spawner.

        Init(); // Lance la fonction Init.
    }
    
	/* Le contenu du bas et du haut ont été supprimé pour plus de lisibilité */

Passons à la méthode « InitVisualCell » et ajoutez ces lignes justes après le ToString.

			//	INSTANCIATION DES SPAWNER DANS LES CELLULES AYANT 3 PORTE FERMER (CUL DE SAC) DANS LA DIRECTION DE LA PORTE OUVERTE
			if(cell._Est == false && cell._North == false && cell._West == false){
				var spawner = Instantiate(spawnerPrefab, new Vector3(visualCellInst.gameObject.transform.position.x, 0.2f, (visualCellInst.gameObject.transform.position.z - offset)), Quaternion.Inverse(visualCellInst._South.transform.rotation)) as Transform;
				spawner.transform.parent = transform;
				spawnList.Add(spawner);
			}

			else if(cell._North == false && cell._West == false && cell._South == false){
				var spawner = Instantiate(spawnerPrefab, new Vector3((visualCellInst.gameObject.transform.position.x + offset), 0.2f, visualCellInst.gameObject.transform.position.z), Quaternion.Inverse(visualCellInst._West.transform.rotation)) as Transform;
				spawner.transform.parent = transform;
				spawnList.Add(spawner);
			}

			else if(cell._West == false && cell._South == false && cell._Est == false){
				var spawner = Instantiate(spawnerPrefab, new Vector3(visualCellInst.gameObject.transform.position.x, 0.2f, (visualCellInst.gameObject.transform.position.z + offset)), Quaternion.Inverse(visualCellInst._North.transform.rotation)) as Transform;
				spawner.transform.parent = transform;
				spawnList.Add(spawner);
			}

			else if(cell._South == false && cell._Est == false && cell._North == false){
				var spawner = Instantiate(spawnerPrefab, new Vector3((visualCellInst.gameObject.transform.position.x - offset), 0.2f, visualCellInst.gameObject.transform.position.z), Quaternion.Inverse(visualCellInst._Est.transform.rotation)) as Transform;				
				spawner.transform.parent = transform;
				spawnList.Add(spawner);
			}

Ce code permet de savoir dans quelle direction est le cul-de-sac, comme ce dernier est composé de 3 murs, il suffit d’interroger les cellules ayant encore 3 murs.
En fonction de la direction, on instancie le spawner dans la direction inverse pour permettre au coffre d’être dans la bonne direction.
On ajoute ensuite le spawner dans la liste de spawn.

Nous allons maintenant créer un nouveau script C#. Nommez le « SpawnItem ». Ajoutez-le sur l’objet qui possède le script « MazeGenerator ».
Comme son nom l’indique, le script permet de faire apparaître des objets dans le labyrinthe. Le script utilisera la liste de spawn du script « MazeGenerator ».

public class SpawnItem : MonoBehaviour
{
	public MazeGenerator mazeGen;  // Référence du script MazeGenerator.
	public GameObject chestPrefab;  // Préfab du coffre.

	public int chestCount;	// Nombre de coffre à faire apparaitre dans le labyrinthe.

	void Start ()
	{
		mazeGen = GetComponent<MazeGenerator>();  // Récupère le script MazeGenerator.
		InitChest();  // Lance la méthode InitChest.
	}
	
    void InitChest ()
	{
		while(chestCount > 0) // Tant que le nombre de coffre est supérieur à 0.
		{
			mazeGen.spawnList.Shuffle();  // Mélange la liste de spawn.

			int randomSpawn = Random.Range(0, mazeGen.spawnList.Count);  // Choisit un nombre aléatoirement entre 0 et le nombre total de coffre dans la liste.

			// Fait apparaitre un coffre aux coordonnées d'un spawn.
			GameObject clone = Instantiate (chestPrefab, new Vector3(mazeGen.spawnList[randomSpawn].position.x, mazeGen.spawnList[randomSpawn].position.y,
								mazeGen.spawnList[randomSpawn].position.z), mazeGen.spawnList[randomSpawn].rotation) as GameObject;

			mazeGen.spawnList.Remove(mazeGen.spawnList[randomSpawn]);	// Supprime le spawn qui vient d'être utiliser de la liste de spawn.

			clone.transform.parent = transform;	 // Définit le parent du clone.

			chestCount--;  // Diminue de 1 le nombre de coffre.

		}
	}
		
}

Elle permet donc de faire apparaître le montant de coffre que vous avez choisis.
À chaque tour de boucle, la méthode sélectionne un emplacement au hasard, fait apparaître le coffre, supprime l’emplacement dans la liste et diminue le nombre de coffre à faire apparaître. Il nous reste maintenant à créer le dernier script.

Créez un nouveau script C# et nommez-le « SpawnPlayer ». Ce script est quasiment identique que celui pour les objets.

using UnityEngine;
using System.Collections;


public class SpawnPlayer : MonoBehaviour
{
	public MazeGenerator mazeGen;  // Référence du script MazeGenerator
	public GameObject player;  // Préfab du joueur.


	void Start ()
	{
		mazeGen = GetComponent<MazeGenerator>();  // Récupère le script MazeGenerator.
		SpawningPlayer();  // Lance la méthode SpawningPlayer.
	}

	void SpawningPlayer ()
	{
		mazeGen.spawnList.Shuffle();  // Mélange la liste de spawn.

		int randomSpawn = Random.Range (0, mazeGen.spawnList.Count);  // / Choisit un nombre aléatoirement.

		// Fait apparaitre le joueur aux coordonnées d'un spawn.
		GameObject clone = Instantiate (player, new Vector3 (mazeGen.spawnList [randomSpawn].position.x, mazeGen.spawnList [randomSpawn].position.y + 1f, mazeGen.spawnList [randomSpawn].position.z),
							mazeGen.spawnList [randomSpawn].rotation) as GameObject;

		mazeGen.spawnList.Remove(mazeGen.spawnList[randomSpawn]);  // Supprime le spawn.

		clone.name = "Player";  // Renomme le prefab en "Player"
	}
		
}

Voilà tous nos scripts sont maintenant terminés.
Placez les préfabs dans les scripts via l’inspector et attribuez une taille et le nombre de coffres à faire apparaître dans le labyrinthe.

Restez logique sur le nombre de coffres. J’exagère un peu, mais ne mettez pas 2000 coffres pour un labyrinthe en 10 x 10 par exemple.

Il reste maintenant une chose à faire. Allez dans Edit > Project Settings > Script Execution Order. Ajoutez, en cliquant sur le petit “+”, le script “MazeGenerator”, “SpawnItem” et “SpawnPlayer”.
Ceci permet d’exécuter les scripts dans l’ordre et éviter qu’ils ne s’exécutent en même temps pour éviter des erreurs.

Si tout s’est bien passé, en lançant le jeu, vous devriez voir le joueur apparaître. Vous pouvez vous déplacer avec les flèches du clavier et pourrez voir les coffres un peu partout dans le labyrinthe.

Voilà pour cette 3e partie du tutoriel. Merci de l’avoir suivi.
N’hésitez pas à laisser un commentaire si vous avez aimé ou pas ou si vous avez des difficultés.

Vous pouvez télécharger le projet ici (Unity 5.3) : Projet Unity 5.3 

Projet en version Unity 2017.2 : Projet Unity 2017.2 

  • Quelque amélioration possible que vous pouvez faire.
    Le modèle 3D utiliser possède une animation d’ouverture et fermeture du couvercle du coffre, vous pouvez donc faire une interaction entre le joueur et le coffre qui permettrait d’ouvrir et de fermer le coffre.
  • Permettre au spawn d’objet de faire apparaitre plusieurs objets différents.
  • Permettre au spawn du joueur de faire apparaitre des joueur contrôler par l’ordinateur (I.A).

Licence Creative Commons
Le tutoriel est mis à disposition selon les termes de la Licence Creative Commons Attribution – Pas d’Utilisation Commerciale – Pas de Modification 4.0 International.

Ré-upload de l’ancien blog.
Date du poste original : 7 mai 2016 
Mise à jour le : 20 mars 2019

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *