[DB-AL] Accès à un ui objet dans un constructeur

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
Kebek
Messages : 9
Inscription : 09 Mars 2018 11:39

[DB-AL] Accès à un ui objet dans un constructeur

Message par Kebek » 27 Fév 2019 18:37

Bonjour, j'ai une question : Je crée une une instance de classe comme ceci :
ic = new InfoCenter();

Et dans mon constructeur, je veux récupérer l'objet BTN_1 comme ceci :

Code : Tout sélectionner

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

public class InfoCenter
{
    [SerializeField]
    GameObject BTN_1;

    public InfoCenter()
    {
        BTN_1.SetActive(true);
    }
Pourquoi unity ne veut pas que j'aille accès à l'object ?
NullReferenceException: Object reference not set to an instance of an object
Pourtant j'ai placé mon objet dans l'inspector...

Merci d'avance pour votre réponse
Kebek

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Accès à un ui objet dans un constructeur

Message par EmileF » 27 Fév 2019 18:52

Salut

parce qu'a aucun moment ton objet a été initialisé.

D'abord ton script n'est pas avec l'extension MonoBehaviour.
en fait il devrait etre:

Code : Tout sélectionner

using UnityEngine;
using UnityEngine.UI;

public class InfoCenter : MonoBehaviour
{
    [SerializeField]
    GameObject BTN_1;

    private void Start() //pour être activé dès le départ
    {
        BTN_1.SetActive(true);
    }
}
et doit être attaché à un objet (Empty par exemple) pour être visible dans l'inspector

il te faut ensuite l'initialiser dans l'inspector en faisant glisser l'objet ui dans BTN_1

Utilise les balise codes pour afficher un script, c'est plus clair
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Kebek
Messages : 9
Inscription : 09 Mars 2018 11:39

Re: [DB-AL] Accès à un ui objet dans un constructeur

Message par Kebek » 28 Fév 2019 00:03

Bonjour, premièrement merci pour votre réponse.

Je suis au couran du MonoBehaviour et de la méthode Start() et j'avais aussi initialiser dans l'inspector en faisant glisser l'objet ui dans BTN_1.

Mais cette classe est une fenêtre qui s'ouvrira lorsque je désirerai l'ouvrir. Bref, je ne veux pas qu'il apparaisse lorsque le script va se déclancher. C'est pour cette raison que je voulais faire un constructeur moi-même et l'apeller seulement lorsque je veux que la fenêtre s'ouvre.

Il y a sûrement quelque chose que je ne comprend pas. Car pour faire son propre constructeur. il ne faut pas que la classe dérive de MonoBehaviour .... À mons que je fasse une classe ou une méthode static..... ou créer un Singleton ....... Je voulais juste faire ça propre mais je crois n'avoir pas tout à fait compris la notion de faire moi même ma classe avec mon propre constructeur.

Merci
Kebek

Kebek
Messages : 9
Inscription : 09 Mars 2018 11:39

Re: [DB-AL] Accès à un ui objet dans un constructeur

Message par Kebek » 28 Fév 2019 00:30

Bonjour, j'ai fait un Singleton mais je ne suis pas certain que cela soit pas aussi propre que si j'avais fait ma propre classe avec mon propre constructeur... Dites-moi si je me trompe svp ;)

Code : Tout sélectionner

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

public class InfoCenter : MonoBehaviour
{
    [SerializeField]
    GameObject PAN_InfoChild, BTN_1, BTN_2;

    [SerializeField]
    Sprite SP_Forest;

    public static InfoCenter Instance;

    void Awake()
    {
        Instance = this;
    }

    private void Start()
    {
        //Type info
        //1: Nouveau joueur
        //SetNewPanelInfo(choix);
    }

    public void SetNewPanelInfo(int choix)
    {
        //Si c'est un nouveau joueur
        if (choix == 1)
        {
            BTN_1.SetActive(true);
            BTN_2.SetActive(true);
            PAN_InfoChild.transform.Find("Image").GetComponent<Image>().sprite = SP_Forest;

            PAN_InfoChild.transform.Find("TXT_Titre").GetComponent<Text>().text = "Bienvenue à " + GameManager.instance.cityName;
            PAN_InfoChild.transform.Find("TXT_Desc").GetComponent<Text>().text = GameManager.instance.playerName +
                ", merci de rejoindre notre communauté de joueur";
        }
    }

    public void Exit()
    {
        Destroy(GameObject.Find("GameManager").gameObject);
        PhotonNetwork.Disconnect();
        UnityEngine.SceneManagement.SceneManager.LoadScene("Start");
    }

    public void Begin()
    {
        PAN_InfoChild.transform.Find("Image").GetComponent<Image>().sprite = null;
        PAN_InfoChild.transform.Find("TXT_Titre").GetComponent<Text>().text = "";
        PAN_InfoChild.transform.Find("TXT_Desc").GetComponent<Text>().text = "";
        BTN_1.SetActive(false);
        BTN_2.SetActive(false);
        gameObject.SetActive(false);
    }
}

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: [DB-AL] Accès à un ui objet dans un constructeur

Message par EmileF » 28 Fév 2019 17:07

Désolé,

je ne comprends pas ce que tu souhaites obtenir, ça doit dépasser mes compétences.

Qu'est ce que tu entends par constructeur. Si c'est un inspector personnalisé il faut passer par l'Editor, enfin je pense que tu sais tout cela

Désolé
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Kebek
Messages : 9
Inscription : 09 Mars 2018 11:39

Re: [DB-AL] Accès à un ui objet dans un constructeur

Message par Kebek » 28 Fév 2019 17:20

Pas de problème, merci d'avoir essayer de m'aider. Si je trouve solution à mon problème, je le posterai ici.
@+

Kebek

zebilamouche
Messages : 38
Inscription : 17 Juin 2016 20:34

Re: [DB-AL] Accès à un ui objet dans un constructeur

Message par zebilamouche » 04 Mars 2019 17:59

Salut,

si l'erreur indiquée en console est genérée lors de l'appel du constructeur, c'est que ta variable 'GameObject BTN_1' n'est pas initialisée.

Comment as-tu initialisé cette dernière ? A priori, pas via l'inspector vu que ta classe n'herite pas de MonoBehaviour.

Répondre

Revenir vers « (C#) CSharp »