Page 1 sur 1

[DB-AL] Boutons du menu principal

Publié : 17 Avr 2019 09:18
par RaeJjin
-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();
            }
        }
    }
}

Re: [DB-AL] Boutons du menu principal

Publié : 17 Avr 2019 09:56
par boubouk50
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?

Re: [DB-AL] Boutons du menu principal

Publié : 17 Avr 2019 18:20
par RaeJjin
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 ?

Re: [DB-AL] Boutons du menu principal

Publié : 17 Avr 2019 18:57
par Max
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.