[DB - AL] Est-il possible de faire une boucle ?

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Clemixo
Messages : 2
Inscription : 28 Nov 2018 23:44

[DB - AL] Est-il possible de faire une boucle ?

Message par Clemixo » 29 Nov 2018 00:02

Bonjour je débute sur unity et j'aimerai savoir s'il est possible de faire une boucle qui m'éviterait de faire plusieurs méthodes comme j'ai fait avec les onClick1() onClick2() onClick3() ...
Merci !

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class click : MonoBehaviour {

    public Button Button1;
    public Button Button2;
    public Button Button3;
    public Button Button4;
    public Button Button5;

    void Start()
    {
        Button2.gameObject.SetActive(false);
        Button3.gameObject.SetActive(false);
        Button4.gameObject.SetActive(false);
        Button5.gameObject.SetActive(false);

        Button1.onClick.AddListener(onClick1);
        Button2.onClick.AddListener(onClick2);
        Button3.onClick.AddListener(onClick3);
        Button4.onClick.AddListener(onClick4);
        Button5.onClick.AddListener(onClick5);
    }

    void onClick1()
    {
        Button2.gameObject.SetActive(true);
        Button1.gameObject.SetActive(false);
    }


    void onClick2()
    {
        Button3.gameObject.SetActive(true);
        Button2.gameObject.SetActive(false);
    }

    void onClick3()
    {
        Button4.gameObject.SetActive(true);
        Button3.gameObject.SetActive(false);
    }

    void onClick4()
    {
        Button5.gameObject.SetActive(true);
        Button4.gameObject.SetActive(false);
    }

    void onClick5()
    {

        Button5.gameObject.SetActive(false);
    }
}

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [DB - AL] Est-il possible de faire une boucle ?

Message par djulio74 » 29 Nov 2018 01:57

Salut.
Tu devrais regarder du coté des Array, qui sont un ensemble d'objet d'un même type.
par exemple si declare:

Code : Tout sélectionner

public class click : MonoBehaviour {
    public Button[] MyButton; // déclaration d'un array de bouton
Dans l'inspector, tu devrais voir ta donnée MyButton. En déroulant, tu vera que Size est a zero. entre le nombre de bouton que tu veux ( ici 5) et tu aura une liste de 5 élément ( de 0 a 4). drag drop tes button dans l'orde.
ensuite tu peux acceder a chaque button dans ton script avec

Code : Tout sélectionner

 MyButton[0]
  MyButton[1]
  
ensuite tu peux assigner dans ta void start :

Code : Tout sélectionner

void Start()
    {
    	Button[0].gameObject.SetActive(true);
        Button[1].gameObject.SetActive(false);
        Button[2].gameObject.SetActive(false);
        Button[3].gameObject.SetActive(false);
        Button[4].gameObject.SetActive(false); // le premier élément ayant l'index '0', pour 5 élément le dernier sera le '4'
        
	// pour tout les bouton tu va pouvoir ajouter la meme fonction:
        Button[0].onClick.AddListener(onClick);
        Button[1].onClick.AddListener(onClick);
        Button[2].onClick.AddListener(onClick);
        Button[3].onClick.AddListener(onClick);
        Button[4].onClick.AddListener(onClick);

    }
ensuite, il faut que tu puisse garder en mémoire le bouton " actif".
par exemple avec un

Code : Tout sélectionner

int ButtonActive = 0
qui dira au debut, c'est le premier button d'actif. du coup dans ta voir OnClick, tu va pouvoir dire :
-je passe le ActiveButton en false => decsactive le bouton en cours
-et le button suivant ( ActiveButton + 1) a true. => active le prochain bouton de la liste.
- il faudra aussi mettre un condition pour le dernier bouton, vu qu'il n'y en aura pas apres.

ta void OnClick pourra ressembler a ça :

Code : Tout sélectionner

void onClick()
    {
        Button[ActiveButton].gameObject.SetActive(false); // desactive le bouton en cours
        if( (ActiveButton + 1) < Mybutton.Length){ // si on ne sors pas de la liste.
       		Button[ActiveButton+1].gameObject.SetActive(true); // on active le prochain bouton de la liste
       		ActiveButton += 1; // on ajoute 1 a activeButton
       	}
       	
    }
Du coup le script comple serait :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Click : MonoBehaviour {

	public Button[]  MyButton;
	int ActiveButton = 0;
	// Use this for initialization
	void Start()
	{
		MyButton[0].gameObject.SetActive(true);
		MyButton[1].gameObject.SetActive(false);
		MyButton[2].gameObject.SetActive(false);
		MyButton[3].gameObject.SetActive(false);
		MyButton[4].gameObject.SetActive(false); // le premier élément ayant l'index '0', pour 5 élément le dernier sera le '4'

		// pour tout les bouton tu va pouvoir ajouter la meme fonction:
		MyButton[0].onClick.AddListener(onClick);
		MyButton[1].onClick.AddListener(onClick);
		MyButton[2].onClick.AddListener(onClick);
		MyButton[3].onClick.AddListener(onClick);
		MyButton[4].onClick.AddListener(onClick);

	}
	
	void onClick()
	{
		MyButton[ActiveButton].gameObject.SetActive(false); // desactive le bouton en cours
		if( (ActiveButton + 1) < MyButton.Length){ // si on ne sors pas de la liste.
			MyButton[ActiveButton+1].gameObject.SetActive(true); // on active le prochain bouton de la liste
			ActiveButton += 1; // on ajoute 1 a activeButton
		}
	}
}
Mais du coup ça ne marchera que si tu as 5 bouton et uniquement 5 dans ton inspector.
pour pouvoir marcher avec autant qu'il y en a il faut rajouter deux trois trucs :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class click : MonoBehaviour {

	public Button[]  MyButton; // une liste de tout tes boutons
	int ActiveButton = 0; // le bouton par lequel tu commence ( 0 est toujours le premier élément d'une liste ou array)
	// Use this for initialization
	void Start()
	{		
		if( MyButton.Length > 0){ // dabord une condition, pour n'affecter tes bouton que s'il y en a dans l'inspector.

			for ( int i = 0 ; i < MyButton.Length ; i++){ // 'i' sera augmenter de 1 en 1, en partant de 0, jusqu'au dernier bouton de la liste.
				MyButton[i].gameObject.SetActive(false);  // ça mettra les bouton en inactif, pour toute les valeurs de 'i' ( de de l'élément 0 au dernier)
				MyButton[i].onClick.AddListener(onClick); // on ajoute OnClick a tout les bouton
			}
			MyButton[ActiveButton].gameObject.SetActive(true); // seul le bouton a l'emplacement ActiveButton ( ici 0, donc le premier) passe actif
		}
	}
	
	void onClick()
	{
		MyButton[ActiveButton].gameObject.SetActive(false); // desactive le bouton en cours
		if( (ActiveButton + 1) < MyButton.Length){ // si on ne sors pas de la liste.
			MyButton[ActiveButton+1].gameObject.SetActive(true); // on active le prochain bouton de la liste
			ActiveButton += 1; // on ajoute 1 a activeButton. si ActiveButton = 0, seul le premier est actif, Si on click dessus, c'est le prochain de la liste qui est ActiveButton
		}
	}
}
Voilà, normalement avec ce code( que je n'ai pas tester par contre), peut importe le nombre de bouton, ça marchera toujours ;-)
:super:
S'il y a quoi que ce soit qui ne marche pas ou que tu ne comprend pas, n'hésite pas ;-)

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Clemixo
Messages : 2
Inscription : 28 Nov 2018 23:44

Re: [DB - AL] Est-il possible de faire une boucle ?

Message par Clemixo » 27 Déc 2018 19:10

Merci pour ton explication bien détaillé, cela ma bien aider ! :super:

Répondre

Revenir vers « (C#) CSharp »