Toujours dans le cadre de mon jeu (http://www.unity3d-france.com/unity/php ... 12&t=16068)
quand Mimi, le perso du jeu atteint une case jaune, que j'appelle Commande, le circuit qui est raccordé à cette case s'allume et s'il atteint un portail, celui-ci s'ouvre.
La grille du jeu est constituée de cases ou cellules contenant diverses choses, comme des contacts, par exemple, ce sont eux qui nous intéressent.
Chaque case, ayant un contact, possède un gameobject, positionné pile au milieu de la bordure de la case, et il est équipé d'un script que j'ai appelé "Ctt".
Left est le contact Ctt situé sur le bord gauche de la case, Right sur le bord Droit, Up sur le bord Haut et Down sur le bord Bas.(que d'originalités ).
Ainsi s'il y a 2 cases voisines horizontalement avec des contacts opposés, exemple Left pour la case de droite et Right pour celle de gauche, ces 2 contacts sont à la même position. (Attention les cases peuvent pivoter, c'est ce qui me permet de suivre le circuit d'une case à l'autre.
Dans le Ctt de chaque contact, il y a un array Others qui contient les autres contacts avec lesquels il est en relation.
Donc pour établir le circuit il faut rechercher alternativement un contact qui est à la même position et une fois trouvé continuer la recherche avec les contacts qui sont en relation avec lui (Others).
Dans Ctt il y a aussi la possibilité de référencer un Portail ce qui permet de commander le portail s'il existe.
Chaque portail est aussi équipé de 2 contacts de ce fait, la connexion peut continuer le long des portails (Je n'utilise pas cette possibilité pour le moment, je trouve que ce n'est pas évident pour le joueur)
Voici donc le script:
Code : Tout sélectionner
//la liste des contacts du jeu
static GameObject[] ContactsDuJeu;
//la case du départ, celle appelée Commande
static Tile depart;
//Le circuit final
static List<GameObject> circuit = new List<GameObject>();
//Eventuellement la liste des portails à ouvrir
internal static List<GameObject> portails;
/// <summary>
/// A n'appeler qu'une fois à la fin de création du niveau
/// </summary>
internal static void Initialisation()
{
ContactsDuJeu = GameObject.FindGameObjectsWithTag("Contact");
}
/// <summary>
/// Ceci est appellé directement par Mimi quand elle est arrivée à destination
/// sur une cellule Jaune (Commande)
/// </summary>
/// <param name="gameObject"></param>
internal static void ChercheCircuit(Tile tile)
{
depart = tile;
//Quels que soient les contacts attribués à la cellule Commande dans l'éditeur
//c'est le ContactX qui est pris comme référence pour la position des Contacts
//au départ.
//Les contacts du départ
List<GameObject> ContactDeDepart = new List<GameObject>()
{
depart.transform.Find("ContactX").Find("Left").gameObject,
depart.transform.Find("ContactX").Find("Up").gameObject,
depart.transform.Find("ContactX").Find("Right").gameObject,
depart.transform.Find("ContactX").Find("Down").gameObject,
};
//décolore les anciens circuits
ColoreCircuit(Color.gray);
//Ce sera le circuit final;
circuit.Clear();
//La liste des portails à ouvrir
portails = new List<GameObject>();
//parcours les contacts du départ
foreach (var dep in ContactDeDepart)
{
//et compose le circuit à partir de ce contact
ComposeCircuit(dep);
}
//colore les circuits trouvés
ColoreCircuit(Color.yellow);
}
/// <summary>
/// Est appelée quand un bouton pour pivoter les contacts a été pressé
/// </summary>
internal static void ChercheCircuit()
{
//si Mimi est encore dans la cellule Commande
if (depart != null)
ChercheCircuit(depart);
}
/// <summary>
/// Appelée quand Mimi sort de la cellule Commande
/// </summary>
internal static void VideDepart()
{
ColoreCircuit(Color.gray);
depart = null;
}
static void ComposeCircuit(GameObject contact)
{
//cherche un contact du jeu dans la même position
foreach (var item in ContactsDuJeu)
{
//si un contact du jeu
if (item != contact)//si l'item est différent de contact
{
//on récupère le composant Ctt
Ctt Ctt = item.GetComponent<Ctt>();
if (item.transform.position == contact.transform.position) // et s'il est à la même position
{
AjouteContact(Ctt);
}
if (Ctt.Val > 0 && Ctt.Val == contact.GetComponent<Ctt>().Val)
AjouteContact(Ctt);
}
}
}
static void AjouteContact(Ctt Ctt)
{
//S'il n'est pas déjà dans le circuit
if (!circuit.Contains(Ctt.gameObject))
//on l'ajoute au circuit
circuit.Add(Ctt.gameObject);
//s'il y a un portail on l'ajoute au portails à ouvrir si possible
if (Ctt.Portail != null)
portails.Add(Ctt.Portail.gameObject);
//on recherche une sortie
foreach (Ctt sortie in Ctt.Others)
{
//s'il est activé on continue la recherche
if (sortie.transform.parent.gameObject.activeSelf &&
!circuit.Contains(sortie.gameObject))
{
//on l'ajoute au circuit
circuit.Add(sortie.gameObject);
//et on continue la recherche
ComposeCircuit(sortie.gameObject);
}
}
}
public static void ColoreCircuit(Color color)
{
//DéColore les circuits existant
foreach (var item in circuit)
{
if (item.GetComponent<Ctt>().Mesh != null)
Utiles.MaterialColor(item.GetComponent<Ctt>().Mesh, color);
}
}
S'il peut aider ou rendre service à quelqu'un j'en serais très heureux.
a bientôt j'espère