[RESOLU] bouton exit dans un environnement 3d

Questions à propos du GUI, y compris la partie script.
lauraneb
Messages : 30
Inscription : 01 Juin 2017 14:14

[RESOLU] bouton exit dans un environnement 3d

Message par lauraneb » 07 Juin 2017 11:56

bonjour : Toujours super debutante, j'ai essayé beaucoup de choses (input, OnCLick, etc) avec les scripts pour juste refermer mon canvas quand on clique sur un bouton UI "ExitButton". J'ai essayé aussi via l'interface de Unity et ça fonctionne pas toujours comme si il ne savait plus ou était la souris (c'est mon interprétation de debutante) sachant que j'ai une scene 3d et quand je clique sur certains objets, il ouvre le canvas qui contient le menu avec le bouton exit. l'ouverture ne pose pas de probleme. Par contre impossible de trouver comment le refermer. Donc j'ai essayé de partir des exemples que donne la documentation mais à chaque fois ça ne marche pas.... Je pense qu'il y a un truc essentiel dans l'organisation de ce qu'on code que je n'ai pas compris. le code justement d'en dessous "plante" mais je ne comprends pas pourquoi puisque c'est celui recommandé par Unity Documentation... ou alors je n'utilise pas la bonne methode mais dans ce cas, quel est la bonne.

Code : Tout sélectionner

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

public class Interactionobject : MonoBehaviour {
    private GameObject Canvas;
    public Button ExitButton;
    //public Texture2D cursorTexture;
    //public CursorMode cursorMode = CursorMode.Auto;
    //public Vector2 hotSpot = Vector2.zero;


    // Use this for initialization
    void Start ()
    {
        
    }

    void Update()
    {
        Button btn = ExitButton.GetComponent<Button>();
        btn.onClick.AddListener(ExitCanvas);
    }

    void OnMouseEnter()
    {
        Cursor.lockState = CursorLockMode.None;
        //Cursor.SetCursor(cursorTexture, hotSpot, cursorMode);
    }

    void OnMouseExit()
    {
        Cursor.lockState = CursorLockMode.Locked;
        //Cursor.SetCursor(null, Vector2.zero, cursorMode);
    }

    void OnMouseDown()
    {
        Canvas.SetActive(true);
    }

    void ExitCanvas()
    {
        Canvas.SetActive(false);
        Cursor.lockState = CursorLockMode.Locked;
    }
}
merci pour les explications et les reponses
Dernière édition par lauraneb le 09 Juin 2017 14:06, édité 1 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6214
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: un bouton exit dans un environnement 3d

Message par boubouk50 » 07 Juin 2017 12:41

Si ça plante, tu dois avoir un message d'erreur rouge qui apparaît en console normalement. Peux-tu nous le poster, stp?
"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

Avatar de l’utilisateur
evereal
Messages : 109
Inscription : 06 Nov 2015 18:46

Re: un bouton exit dans un environnement 3d

Message par evereal » 07 Juin 2017 13:50

Ne pas rajouter le listener dans l'update, tu n'a pas envies que ta méthode soit appelée 10000fois quand tu cliques sur le bouton, donc on va mettre ça dans la méthode Start().
Ensuite tu essayes d’accéder au composant button d'un... composant button, j'enlève le superflu et ça donne :

Code : Tout sélectionner

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

public class Interactionobject : MonoBehaviour {
    private GameObject canvas;
    public Button exitButton;
    //public Texture2D cursorTexture;
    //public CursorMode cursorMode = CursorMode.Auto;
    //public Vector2 hotSpot = Vector2.zero;


    // Use this for initialization
    void Start ()
    {
       exitButton.onClick.AddListener(ExitCanvas);       
    }

    void OnMouseEnter()
    {
        Cursor.lockState = CursorLockMode.None;
        //Cursor.SetCursor(cursorTexture, hotSpot, cursorMode);
    }

    void OnMouseExit()
    {
        Cursor.lockState = CursorLockMode.Locked;
        //Cursor.SetCursor(null, Vector2.zero, cursorMode);
    }

    void OnMouseDown()
    {
        canvas.SetActive(true);
    }

    void ExitCanvas()
    {
        canvas.SetActive(false);
        Cursor.lockState = CursorLockMode.Locked;
    }
}
“La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !”

lauraneb
Messages : 30
Inscription : 01 Juin 2017 14:14

Re: un bouton exit dans un environnement 3d

Message par lauraneb » 07 Juin 2017 14:22

le message d'erreur est :
NullReferenceException: Object reference not set to an instance of an object
Interactionobject.Update () (at Assets/MyAssets/scripts/Interactionobject.cs:23)
la fonction est
https://docs.unity3d.com/2017.1/Documen ... Click.html

et j'essaye la réponse proposée mais alors il faut se mefier des exemples données dans la documentation ????

lauraneb
Messages : 30
Inscription : 01 Juin 2017 14:14

Re: un bouton exit dans un environnement 3d

Message par lauraneb » 07 Juin 2017 14:37

une fois testée dans le start, le probleme ne se pose plus au demarrage du jeu mais quand je clique sur l'un des objets. il me donne l'erreur suivante :
NullReferenceException: Object reference not set to an instance of an object
Interactionobject.OnMouseDown () (at Assets/MyAssets/scripts/Interactionobject.cs:40)
UnityEngine.SendMouseEvents:DoSendMouseEvents(Int32)
pourtant j'ai vérifié que la variable publique exit button est bien assignée au bouton exitbutton avant le demarrage du jeu et quand ça me donne le message d'erreur elle est toujours assignée...

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6214
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: un bouton exit dans un environnement 3d

Message par boubouk50 » 07 Juin 2017 14:42

L'erreur est donc à la ligne 40, une variable est non référencée.
Quelle est cette ligne? Est-ce le canvas?

Ensuite, non la documentation est bonne, tu ne peux juste pas la copier coller n'importe comment comme tu as fait.
Comme la fait remarquer evereal, déjà , l'exemple est dans le Start () et pas dans l'Update().

Egalement, les noms de variables doivent commencer par une minuscule pour éviter qu'elles prennent un nom de classe ou de fonction.
Ici tu nommes une variable Canvas, alors que ce nom est déjà pris par une Classe existante. Tu ne peux pas appeler ta variable ainsi sous risque de conflit.
"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

lauraneb
Messages : 30
Inscription : 01 Juin 2017 14:14

Re: un bouton exit dans un environnement 3d

Message par lauraneb » 07 Juin 2017 15:06

oui j'ai bien vu l'erreur entre start et update. j'avais au depart coller correctement mais j'avais la meme erreur aussi et sur la ligne du start. l'erreur sur le canvas arrive seulement ensuite...
ensuite le canvas c'est le canvas definit dans unity pour faire mon menu et il l'a nommé "Canvas".... apres c'est peut etre pas la bonne methode pour lui dire que c'est ce gameobjet que je souhaite fermer.... raison pour laquelle je pense qu'il y a un concept important qui m'échappe dans la maniere de faire les scripts car en lisant la documentation il y a plein de chose a faire avec les boutons et j'en ai essayé plusieurs qui me paraissait correctes avant de trouver OnClic... je tatonne a vrai dire mais je me demande si je n'essaye pas de faire quelque chose qui n'ai pas faisable puisque je n'ai pour l'instant vu aucun exemple qui le faisait....
Image

Avatar de l’utilisateur
evereal
Messages : 109
Inscription : 06 Nov 2015 18:46

Re: un bouton exit dans un environnement 3d

Message par evereal » 07 Juin 2017 15:15

la ligne 40 est bien le canvas

Code : Tout sélectionner

 canvas.SetActive(false);
De la même façon que tu as assigné ton exitButton au bouton exit, tu dois assigner ton canvas au canvas.
Ici tu as déclaré la variable privée donc tu ne la verra pas dans l'inspecteur, change la ligne du début

Code : Tout sélectionner

private GameObject canvas;
par

Code : Tout sélectionner

[SerializeField] private GameObject canvas;
Tu pourra ensuite assigner ton canvas dans l'inspecteur.
“La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !”

lauraneb
Messages : 30
Inscription : 01 Juin 2017 14:14

Re: un bouton exit dans un environnement 3d

Message par lauraneb » 07 Juin 2017 15:46

dans la doc "Force Unity to serialize a private field." ça m'aide pas vraiment a comprendre ;)
je suppose que le [SerializeField] oblige unity à prendre un champ private comme un champ public. en réalité ça ne me pose pas vraiment de probleme qui soit public...
- Mais alors peut on appeler un gameobjet directement dans le code sans devoir le lier à chaque fois à l'objet . parce que admettons que j'ai 200 objets qui ont la fonction... et que ces objets sont deja en place...

il y a un mois de ça je ne connaissais rien à unity et encore moins c#. ;)
j'ai appris une chose ne jamais commencer par une lettre capitale (une mauvaise habitude à perdre)

- le bouton exit ne ferme pas toujours la fenetre, des fois il le fait et des fois non et on dirait que c'est en fonction de la position du bouton et de la souris... d'ou peut etre la raison pour laquelle on ne trouve pas ce type d'action en fps, non ?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6214
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: un bouton exit dans un environnement 3d

Message par boubouk50 » 07 Juin 2017 16:27

Tu n'es pas obligée de tout faire à la main, tu peux retrouver des gameObjects par code avec des fonctions dédiées: Find / FindWithTag / etc, qui sont à utiliser avec parcimonie puisque gourmandes (généralement une fois dans le Start ())
Egalement, tu peux passer par la hiérarchie. Admettons que le canvas soit celui ou le bouton Exit se trouve, alors tu peux passer par les parents ou les roots (racines). C'est beaucoup plus léger.
Tu peux également essayer de paramétrer tes gameobjects, par exemple, pour le cas d'une bulle de dialogue, tu ne vas pas t'amuser à en créer 200. Tu vas en créer une seule qui aura toujours le même comportement: afficher du texte + bouton fermer (par ex). Et les éléments changeant seront alors récupérés ailleurs (par exemple le texte sera écrit dans la classe du PNJ qui ouvre la bulle du dialogue). Il faut essayer de créer une base commune puis de paramétrer le reste. Le GameObject ainsi créé pourra être transformé en Prefab pour pouvoir être instancié n'importe où et n'importe quand.
"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

Répondre

Revenir vers « L'interface GUI »