Tutoriels Jeux de plateforme

part3 - Les Plateformes

Partie 3 :Les plateformes

  Les types de plateformes   préparation des scripts   Le script des plateformes   Mode d'emploi du script plateforme
  Partie 1 : La création du monde
  Partie 2 : La création du personnage

Les types de plateforme

Nous allons mettre en place 3 types de plateformes, si vous avez besoin d'autres types de plateformes n'hésitez pas à nous contacter.
Donc, nous allons avoir : une plateforme FIXE, LIBRE et une autre ROTATION

  • FIXE :
  • Comme son nom l'indique elle restera immobile.

  • LIBRE
  • Vous pourrez lui donnez n'importe qu'elle type de chemin à effectuer et arrivé au dernier point, elle fera le chemin dans le sens inverse.

  • ROTATION
  • Il y aura un point de pivot à placer et la plateforme tournera autour en fonction de l'axe que vous choisirez ( X,Y,Z).


Préparation du script

Aller sur votre dossier scripts, faites un clic droit/ Create / c# scripts ou Javascript et nommez le Plateforme
Ensuite, allez dans votre dossier Prefabs et selectionner votre prefabs Plateforme puis cliquez sur AddComponnent/Scripts et selectionné votre script plateforme.
Il reste une dernière chose à faire. Sélectionnez sur l'une de vos plateformes dans votre Hierarchy et ajouter lui un objet vide que vous appelerez direction.
Il contiendra les differents points de direction de votre plateforme si elle bouge. Une fois ceci fait, cliquez sur Apply dans l'inspector. Cela appliquera ce que l'on vient de faire à toutes les plateformes.


Le code des plateformes

// code : C#
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]//permet d'executer le script sans appuyer sur le bouton lecture dans Unity.
public class Plateforme : MonoBehaviour {

	public enum Genre{FIXE, ROTATION, LIBRE};		// On enumère le nombre de type de plateforme que l'on peut avoir. 
	public Genre typePlateforme;			// variable qui recupere l'information GENRE 
	public int nbOfPoint ;					// nombre de point utiliser pour bouger la plateforme
	public Vector2[] waypoint ;				// les coordonées des points de trajectoire de la plateforme
	Transform[] child ;						// les points de trajectoires
	public int editorRefresh;				// reinitialiser le script
	public Transform directionFolder ;		// objet vide qui contiendra les points de direction
	public float speed ;					// vitesse de déplacement de la plateforme
	float dist;								// distance de la plateforme par rapport à son point de destination
	Vector3 target;							// point ciblé par la plateformz
	int id ;									// identification du point ciblé
	bool forward ;							// determine si la plateforme va vers l'avant ou l'arrière
	int nbChild ; 							// nombre de point generer dans le dossier directionFolder
	public enum Axis{X,Y,Z};						// énumération du nombre d'axe utilisable
	public Axis axe; 						// variable utilisé pour determiner l'axe de rotation. 
	
	
	void SetPlateforme () {// fonction pour determiner le type de plateforme 

		switch ( typePlateforme)
		{
		case Genre.FIXE : // si on choisit le fixe on ne genere pas de point de trajectoire
			nbOfPoint = 0;
			break;
			
		case Genre.ROTATION : //  si on choisit la rotation, on genere 1 point de trajectoire qui sera notre pivot
			nbOfPoint =1;
			if ( directionFolder != null )// des que le directionFolder est detecter, on le rend indépendant, sans qu'il ait de parents 
			{
				directionFolder.transform.parent = null;// de cette maniere, le point de pivot restera à l'endroit où on l'avait décidé. 
			}
			break;
			
		case Genre.LIBRE :// dans le cas ou on choisit libre, on ne fait rien de spécifique, tous les renseignement seront à faire dans l'editeur de Unity.
			
			break;
		}
		
		
	}
	
	void SetWayPoint () {
		if ( nbOfPoint > 0)//si le nombre de point de trajectoire est superieur à zero alors, on les recherches
		{
			directionFolder = gameObject.transform.GetChild(1).transform;// on definit le direction folder 
			waypoint = new Vector2[nbOfPoint];// le tableau waypoint est d'une grandeur de nbOfPoint
			for (var i = 0 ; i < waypoint.Length ; i++)
			{
				GameObject pos  = GameObject.CreatePrimitive(PrimitiveType.Cube);//on genere les points de trajectoire
				pos.GetComponent < MeshRenderer > ().enabled = false;// on enleve le meshRenderer
				pos.GetComponent < Collider > ().enabled = false;// on enleve le collider
				if ( directionFolder != null ) pos.transform.parent = directionFolder;// on parente les points de trajectoire au directionFolder 
				
			}
			
		}else
		{
			directionFolder = gameObject.transform.GetChild(1).transform;// on definit le direction folder 
		}
	}
	
	void SetWayPointPosition ()
	{
		var nbOfChild = directionFolder.childCount; // on recupere le nombre d'enfant de directionFolder
		
		child = new Transform[ nbOfChild]; // le tableau child est d'une grandeur de nbOfChild
		for ( var j = 0 ; j < child.Length ; j++ ){
			child[j] = directionFolder.GetChild(j).transform; // child contient les enfants de directionFolder
			child[j].position = waypoint[j]; //les point de trajectoire child ont les positions donné par les coordonnées waypoint
		}
		
	}
	
	
	void OnDrawGizmos()// ici on rajoute juste un peu de visuel pour facilité l'édition
	{
		if (directionFolder!= null )
		{
			if (directionFolder.transform.childCount!=0)
			{
				Transform[] giz ; 
				
				giz = new Transform[ directionFolder.transform.childCount];//giz rerésente les points de trajectoire
				Gizmos.color = Color.cyan; //les gizmos seront de couleurs cyan
				
				
				for (var k = 0 ; k < giz.Length; k++)
				{
					giz[k] = directionFolder.GetChild(k).transform;
					Gizmos.DrawCube(giz[k].position, new Vector3(1,1,1));// on dessine un cube de couleur cyan pour chaque point de trajectoire
				}
				// On fait de meme, si il n'y a qu'un seul point de trajectoire.
				for (var l = 0 ; l < giz.Length-1; l++)
				{
					Gizmos.DrawLine(giz[l].position, giz[l+1].position);
				}
				
				
			}
			
		}
	}
	
	
	void MovePlateforme ()
	{
		
		nbChild = directionFolder.childCount;// on recupere le nombre de point de trajectoire 
		target = directionFolder.GetChild(id).transform.position; // la target est l'enfant ID du directionFolder
		
		if ( id > = nbChild-1){ //si l'ID est superieur ou egale au dernier enfant 
			forward = false;// on ne se dirige plus vers l'avant
			
		}
		
		if ( id < = 0 )// si l'ID est inferieur ou egale au 1er enfant 
		{
			forward = true;// on se dirige a nouveau vers l'avant
		}
		
		transform.position = Vector3.Lerp( transform.position,target , speed * Time.deltaTime); //on deplace la plateforme vers la target 
		dist = Vector3.SqrMagnitude( transform.position-target);// on calucle la distance de la plateforme par rapport à la target
		if ( dist < = 1 ){// si la distance est inferieur ou egale à 1
			if ( forward )
			{
				id++; // si on va vers l'avant, on incrément de 1 l'ID
			}else
			{
				id--; // si on va vers l'arriere on décrémente de 1 l'ID
			}
		}
		
		
		
	}
	void RotaionPlateforme  ()
	{
		
		nbChild = directionFolder.childCount;// on recupere le nombre de point de trajectoire 
		target = directionFolder.GetChild(id).transform.position; // la target est l'enfant ID du directionFolder
		
		
		switch ( axe){// En fonction de l'axe de rotation choisit, on fait tourner la plateforme par rapport au point de pivot
		case Axis.X : 
			transform.RotateAround(target, Vector3.right, speed * Time.deltaTime);
			break;
		case Axis.Y : 
			transform.RotateAround(target, Vector3.up, speed * Time.deltaTime);
			break;
		case Axis.Z : 
			transform.RotateAround(target, Vector3.forward, speed * Time.deltaTime);
			break;
		}
		
	}
	void Update ()
	{// Dans le cas ou on est dans l'edition que ce soit sur  windows ou osx
		if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.OSXEditor)
		{
			//A chaque fois que l'on reinitialise le script
			while ( editorRefresh < 1){ 
				SetPlateforme();//on re- détermine le type de plateforme
				SetWayPoint();// on regarde si il y a des points de trajectoire à générer
				editorRefresh++;//on stop la reinitialisation
			}
		}
		// sinon lorsque l'on est dans le jeu 
		
		if ( typePlateforme == Genre.LIBRE) MovePlateforme(); //  si plateforme est de type LIBRE on fait bouger la plateforme
		if ( typePlateforme == Genre.ROTATION) RotaionPlateforme(); // si la plateforme est de type ROTATION, on la fait tourner.
		
		
	}
	
	void LateUpdate ()
	{
		SetWayPointPosition();//On definit la position des points de trajectoire une fois que tout ce qu'il y a dans l'update est définie. 
	}

}


// code : JS
#pragma strict
@script ExecuteInEditMode();//permet d'executer le script sans appuyer sur le bouton lecture dans Unity.

enum Genre{FIXE, ROTATION, LIBRE};	// On enumère le nombre de type de plateforme que l'on peut avoir. 
var typePlateforme : Genre;			// variable qui recupere l'information GENRE 
var nbOfPoint : int;				// nombre de point utiliser pour bouger la plateforme
var waypoint : Vector2[];			// les coordonées des points de trajectoire de la plateforme
private var child : Transform[];	// les points de trajectoires
var editorRefresh : int;			// reinitialiser le script
var directionFolder : Transform;	// objet vide qui contiendra les points de direction
var speed : float;					// vitesse de déplacement de la plateforme
private var dist : float;			// distance de la plateforme par rapport à son point de destination
private var target : Vector3;		// point ciblé par la plateformz
var id : int;						// identification du point ciblé
var forward : boolean;				// determine si la plateforme va vers l'avant ou l'arrière
private var nbChild : int; 			// nombre de point generer dans le dossier directionFolder
enum Axis{X,Y,Z};					// énumération du nombre d'axe utilisable
var axe : Axis;						// variable utilisé pour determiner l'axe de rotation. 


function SetPlateforme () {// fonction pour determiner le type de plateforme 
    switch ( typePlateforme)
    {
        case typePlateforme.FIXE : // si on choisit le fixe on ne genere pas de point de trajectoire
            nbOfPoint = 0;
        break;

        case typePlateforme.ROTATION : //  si on choisit la rotation, on genere 1 point de trajectoire qui sera notre pivot
            nbOfPoint =1;
            if ( directionFolder != null )// des que le directionFolder est detecter, on le rend indépendant, sans qu'il ait de parents 
            {
            	directionFolder.transform.parent = null;// de cette maniere, le point de pivot restera à l'endroit où on l'avait décidé. 
        	}
        break;
        
        case typePlateforme.LIBRE :// dans le cas ou on choisit libre, on ne fait rien de spécifique, tous les renseignement seront à faire dans l'editeur de Unity.
            
        break;
    }

    
}

function SetWayPoint () {
    if ( nbOfPoint > 0)//si le nombre de point de trajectoire est superieur à zero alors, on les recherches
    {
        directionFolder = gameObject.transform.GetChild(1).transform;// on definit le direction folder 
        waypoint = new Vector2[nbOfPoint];// le tableau waypoint est d'une grandeur de nbOfPoint
        for (var i = 0 ; i < waypoint.Length ; i++)
        {
            var pos : GameObject = GameObject.CreatePrimitive(PrimitiveType.Cube);//on genere les points de trajectoire
            pos.GetComponent. < MeshRenderer > ().enabled = false;// on enleve le meshRenderer
            pos.GetComponent. < Collider > ().enabled = false;// on enleve le collider
            if ( directionFolder != null ) pos.transform.parent = directionFolder;// on parente les points de trajectoire au directionFolder 
           
        }
         
    }else
    {
     directionFolder = gameObject.transform.GetChild(1).transform;// on definit le direction folder 
    }
}

function SetWayPointPosition ()
{
    var nbOfChild = directionFolder.childCount; // on recupere le nombre d'enfant de directionFolder

	    child = new Transform[ nbOfChild]; // le tableau child est d'une grandeur de nbOfChild
	    for ( var j = 0 ; j < child.Length ; j++ ){
	        child[j] = directionFolder.GetChild(j).transform; // child contient les enfants de directionFolder
	        child[j].position = waypoint[j]; //les point de trajectoire child ont les positions donné par les coordonnées waypoint
	    }
    
}


function OnDrawGizmos()// ici on rajoute juste un peu de visuel pour facilité l'édition
{
    if (directionFolder!= null )
    {
        if (directionFolder.transform.childCount!=0)
        {
            var giz : Transform[]; 
            
            giz = new Transform[ directionFolder.transform.childCount];//giz rerésente les points de trajectoire
            Gizmos.color = Color.cyan; //les gizmos seront de couleurs cyan
            
            
            for (var k = 0 ; k < giz.Length; k++)
            {
                giz[k] = directionFolder.GetChild(k).transform;
                Gizmos.DrawCube(giz[k].position, Vector3(1,1,1));// on dessine un cube de couleur cyan pour chaque point de trajectoire
            }
			// On fait de meme, si il n'y a qu'un seul point de trajectoire.
            for (var l = 0 ; l < giz.Length-1; l++)
            {
                Gizmos.DrawLine(giz[l].position, giz[l+1].position);
            }
           
            
        }
       
    }
}


function MovePlateforme ()
{
	
	nbChild = directionFolder.childCount;// on recupere le nombre de point de trajectoire 
	target = directionFolder.GetChild(id).transform.position; // la target est l'enfant ID du directionFolder
	
	if ( id > = nbChild-1){ //si l'ID est superieur ou egale au dernier enfant 
		forward = false;// on ne se dirige plus vers l'avant
		
	}
	
	if ( id < = 0 )// si l'ID est inferieur ou egale au 1er enfant 
	{
		forward = true;// on se dirige a nouveau vers l'avant
	}
	
	transform.position = Vector3.Lerp( transform.position,target , speed * Time.deltaTime); //on deplace la plateforme vers la target 
	dist = Vector3.SqrMagnitude( transform.position-target);// on calucle la distance de la plateforme par rapport à la target
	if ( dist < = 1 ){// si la distance est inferieur ou egale à 1
		if ( forward )
		{
			id++; // si on va vers l'avant, on incrément de 1 l'ID
		}else
		{
			id--; // si on va vers l'arriere on décrémente de 1 l'ID
		}
	}
	

	
}
function RotaionPlateforme  ()
{
	
	nbChild = directionFolder.childCount;// on recupere le nombre de point de trajectoire 
	target = directionFolder.GetChild(id).transform.position; // la target est l'enfant ID du directionFolder
	
	
	switch ( axe){// En fonction de l'axe de rotation choisit, on fait tourner la plateforme par rapport au point de pivot
		case axe.X : 
			transform.RotateAround(target, Vector3.right, speed * Time.deltaTime);
		break;
		case axe.Y : 
			transform.RotateAround(target, Vector3.up, speed * Time.deltaTime);
		break;
		case axe.Z : 
			transform.RotateAround(target, Vector3.forward, speed * Time.deltaTime);
		break;
	}

}
function Update ()
{// Dans le cas ou on est dans l'edition que ce soit sur  windows ou osx
    if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.OSXEditor)
    {
    	//A chaque fois que l'on reinitialise le script
        while ( editorRefresh < 1){ 
            SetPlateforme();//on re- détermine le type de plateforme
            SetWayPoint();// on regarde si il y a des points de trajectoire à générer
            editorRefresh++;//on stop la reinitialisation
        }
    }
    // sinon lorsque l'on est dans le jeu 
    
   if ( typePlateforme == typePlateforme.LIBRE) MovePlateforme(); //  si plateforme est de type LIBRE on fait bouger la plateforme
   if ( typePlateforme == typePlateforme.ROTATION) RotaionPlateforme(); // si la plateforme est de type ROTATION, on la fait tourner.
    
    
}

function LateUpdate ()
{
    SetWayPointPosition();//On definit la position des points de trajectoire une fois que tout ce qu'il y a dans l'update est définie. 
}


                                    

Mode d'emploi du script Plateforme


  • Dès que vous faites une manipulation dans l'éditor sur le script Plateforme :
  • Faites un RefreshEditor en le mettant à 0. Il se réinitialisera et se mettra automatiquement de nouveau à 1. Ainsi, si vous passez du mode FIXE à LIBRE, vous aurez à choisir le nombre de point de direction que la plateforme à a parcourir. ils seront visibles dans le gameObject Direction de la plateforme.
  • Pour les déplacer les points de direction :
  • il faut utilisé la parti WayPoints du script en touchant au coordonné X et Y.

Fin de la partie 3
  Partie 4 : Intéractions plateformes



  Partie 1 : La création du monde   Partie 2 : La création du personnage

Les tutoriels que nous vous proposons