[DB-AL] Boutons du menu principal

Modérateurs : Administrateurs Suppléants, Community Manager

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
RaeJjin
Messages : 2
Inscription : 17 Avr 2019 08:45

[DB-AL] Boutons du menu principal

Message par RaeJjin » 17 Avr 2019 09:18

-NOM DU SCRIPT : Bouttons.cs

-DESCRIPTION : script servant à gérer les Bouttons du menu principal du jeu (nouveau jeu, continuer etc...

-UTILISATION : placer le code dans les Bouttons de la scène, puis insérer les prefabs de chaque boutons dans leur case du script component correspondant

-PROBLÈME : bien que Unity ne me signale aucune erreur sur le code, au lancement du jeu l'objet Selection n'apparaît pas, alors qu'il devrait être visible et placé au niveau du bouton Nouveau Jeu... Du coup lorsque l'on appuie sur flèche du haut, flèche du bas ou la touche action (E), rien ne se passe. Mon code est sûrement extrêmement nul, je suis un total débutant perdu x)

-SCRIPT :

Code : Tout sélectionner

using UnityEngine;
using ORKFramework;
using ORKFramework.Behaviours;

public class Bouttons : MonoBehaviour
{
    public GameObject Selection; //objet de la scene qui se place à côté du bouton sélectionné par le joueur
    public GameObject NouveauJeu;
    public GameObject Continuer;
    public GameObject Options;
    public GameObject QuitterLaPartie;
    public int highlightButton = 0; //variable de selection
    public int pressButton = 0; //variable d'appui sur un bouton

    void update()
    {
        Selection.transform.Translate(200, -200, 0);//position de départ du bouton Sélection, à côté du bouton NouveauJeu
        while (Input.GetKey(KeyCode.DownArrow) || Input.GetAxis("Vertical") < 0)
        {
            highlightButton++;
            if (highlightButton == 0)
            {
                Selection.transform.Translate(0, 0, 0); //l’objet Selection ne doit pas bouger 
            }
            if (highlightButton == 1)
            {
                Selection.transform.Translate(0, -70, 0); //l’objet Selection descend de 70 unités vers le bas (vers le bouton Continuer) 
            }
            if (highlightButton == 2)
            {
                Selection.transform.Translate(0, -70, 0);
            }
            if (highlightButton == 3)
            {
                Selection.transform.Translate(0, -70, 0);
            }
            if (highlightButton > 3)
            {
                highlightButton = 0;
                Selection.transform.Translate(0, 210, 0);
            }
        }
        while (Input.GetKey(KeyCode.UpArrow) || Input.GetAxis("Vertical") > 0)
        {
            highlightButton--;
            if (highlightButton == 0)
            {
                Selection.transform.Translate(0, 0, 0);
            }
            if (highlightButton == 1)
            {
                Selection.transform.Translate(0, 70, 0);
            }
            if (highlightButton == 2)
            {
                Selection.transform.Translate(0, 70, 0);
            }
            if (highlightButton == 3)
            {
                Selection.transform.Translate(0, 70, 0);
            }
            if (highlightButton < 0)
            {
                highlightButton = 3;
                Selection.transform.Translate(0, -210, 0);
            }
        }
        pressButton = highlightButton;
        while (Input.GetKeyDown("E") || Input.GetKeyDown("JoystickButton0"))
        {
            if (pressButton == 0)
            {
                NouveauJeu.GetComponent<Animation>().Play("NouveauJeuPress");
                ORK.Game.NewGame(true);
            }
            if (pressButton == 1)
            {
                Continuer.GetComponent<Animation>().Play("ContinuerPress");
                ORK.SaveGame.Load(1);
            }
            if (pressButton == 2)
            {
                Options.GetComponent<Animation>().Play("OptionsPress");
                // lancer ecran options;
            }
            if (pressButton == 3)
            {
                QuitterLaPartie.GetComponent<Animation>().Play("QuitterLaPartiePress");
                Application.Quit();
            }
        }
    }
}

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 4908
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [DB-AL] Boutons du menu principal

Message par boubouk50 » 17 Avr 2019 09:56

Salut,
je pense que tu n'as pas saisi l'utilité de la fonction Update ().
l'Update est une fonction qui est appelée à chaque rafraichissement de l'affichage. Pour une application qui tourne à 60FPS, l'Update sera appelée 60 fois dans la seconde. Tu peux la considérer comme "une boucle".
Donc:
- Initialiser des variables revient à les initialiser tout le temps. > le faire dans le Start () par exemple.
- Faire des boucles d'attente (while) dans une fonction qui boucle, ça ne fait que bloquer l'Update suivant, donc bloquer ton jeu. > Laisser l'Update s'en occuper.
Aussi, il est important de respecter l'orthographe et la casse des noms de fonction et de variable.
void Update(){} et pas void update(){}, sinon elle sera considérée comme une autre fonction et ne jouera pas son rôle de boucle.

Code : Tout sélectionner

Selection.transform.Translate(200, -200, 0);//position de départ du bouton Sélection, à côté du bouton NouveauJeu
Faux, à chaque Update () ton bouton sera déplacé de (200, -200, 0), soit environ (12000, -12000, 0) par secondes... normal qu'il disparaisse.

Code : Tout sélectionner

while (Input.GetKey(KeyCode.DownArrow) || Input.GetAxis("Vertical") < 0) {...}
Une boucle d'attente dans une fonction qui boucle: Inutile et risqué. Proscris-toi des while.

Il y a aussi surement un souci dans la conception. Pourquoi tout gérer ici au lieu de laisser chaque bouton se gérer lui-même?
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

RaeJjin
Messages : 2
Inscription : 17 Avr 2019 08:45

Re: [DB-AL] Boutons du menu principal

Message par RaeJjin » 17 Avr 2019 18:20

Merci beaucoup pour ta réponse très complète !
J'ai changé le Update en Start, mais je ne vois pas comment faire sans les while si j'utilise Start par contre, du coup je les ai conservé pour l'instant x)
Après avoir changé deux trois choses, maintenant l'objet Selection reste bien où il est sensé être au lancement de la partie, mais aucune touche de mon clavier ne produit de réaction, ni les flèches pour naviguer ni la touche E pour valider :(

mise à jour du code

Code : Tout sélectionner

using UnityEngine;
using ORKFramework;
using ORKFramework.Behaviours;

public class Bouttons : MonoBehaviour
{
    public GameObject Selection;
    public GameObject NouveauJeu;
    public GameObject Continuer;
    public GameObject Options;
    public GameObject QuitterLaPartie;
    public int highlightButton = 0;
    public int pressButton = 0;

    void Start()
    {
        while (Input.GetKeyDown(KeyCode.DownArrow))
        {
            highlightButton++;
            if (highlightButton == 0)
            {
                Selection.transform.Translate(0, 0, 0);
            }
            if (highlightButton == 1)
            {
                Selection.transform.Translate(0, -70, 0);
            }
            if (highlightButton == 2)
            {
                Selection.transform.Translate(0, -70, 0);
            }
            if (highlightButton == 3)
            {
                Selection.transform.Translate(0, -70, 0);
            }
            if (highlightButton > 3)
            {
                highlightButton = 0;
                Selection.transform.Translate(0, 210, 0);
            }
        }
        while (Input.GetKeyDown(KeyCode.UpArrow))
        {
            highlightButton--;
            if (highlightButton == 0)
            {
                Selection.transform.Translate(0, 0, 0);
            }
            if (highlightButton == 1)
            {
                Selection.transform.Translate(0, 70, 0);
            }
            if (highlightButton == 2)
            {
                Selection.transform.Translate(0, 70, 0);
            }
            if (highlightButton == 3)
            {
                Selection.transform.Translate(0, 70, 0);
            }
            if (highlightButton < 0)
            {
                highlightButton = 3;
                Selection.transform.Translate(0, -210, 0);
            }
        }
        while (Input.GetKeyDown(KeyCode.E))
        {
            pressButton = highlightButton;
            if (pressButton == 0)
            {
                NouveauJeu.GetComponent<Animation>().Play("NouveauJeuPress");
                ORK.Game.NewGame(true);
            }
            if (pressButton == 1)
            {
                Continuer.GetComponent<Animation>().Play("ContinuerPress");
                ORK.SaveGame.Load(1);
            }
            if (pressButton == 2)
            {
                Options.GetComponent<Animation>().Play("OptionsPress");
                // lancer ecran options;
            }
            if (pressButton == 3)
            {
                QuitterLaPartie.GetComponent<Animation>().Play("QuitterLaPartiePress");
                Application.Quit();
            }
        }
    }
}
Que voudrais-tu dire par "Pourquoi tout gérer ici au lieu de laisser chaque bouton se gérer lui-même?", en tant que débutant je ne vois pas trop comment faire autrement, c'est mon tout premier code haha x)
Tu veux dire créer un code individuel pour chaque bouton ?

Avatar de l’utilisateur
Max
Newser
Newser
Messages : 6975
Inscription : 30 Juil 2011 13:57

Re: [DB-AL] Boutons du menu principal

Message par Max » 17 Avr 2019 18:57

RaeJjin a écrit :
17 Avr 2019 18:20
Que voudrais-tu dire par "Pourquoi tout gérer ici au lieu de laisser chaque bouton se gérer lui-même?", en tant que débutant je ne vois pas trop comment faire autrement, c'est mon tout premier code haha x)
Tu veux dire créer un code individuel pour chaque bouton ?
Il te faut une approche vraiment UI, et dans ce genre de menu la gestion doit se faire pour chaque bouton indépendamment les uns des autres. Donc il faut regarder de ce coté là., comment se fait la mise en œuvre ainsi que la gestion des événements associés. Regarde du coté du Learn, en particulier la partie User Interface (UI).
RaeJjin a écrit :
17 Avr 2019 09:18
-UTILISATION : placer le code dans les Bouttons de la scène, puis insérer les prefabs de chaque boutons dans leur case du script component correspondant
je vais être franc, j'ai pas vraiment compris.

Sinon, après pour ton code, comme souligné plus haut, les Whiles sont à proscrire.
Les fonctions de type Input.GetKeyDown() se suffisent à elles mêmes. Chaque pression sur une touche génère un événement qu'il suffit de tester (par un if). Comme pour tout débutant, premier réflexe: la doc. Input.GetButtonDown.
Il y a un exemple d'utilisation.
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Répondre

Revenir vers « (C#) CSharp »