Page 1 sur 1

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

Publié : 27 Fév 2019 18:37
par Kebek
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

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

Publié : 27 Fév 2019 18:52
par EmileF
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

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

Publié : 28 Fév 2019 00:03
par Kebek
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

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

Publié : 28 Fév 2019 00:30
par Kebek
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);
    }
}

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

Publié : 28 Fév 2019 17:07
par EmileF
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é

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

Publié : 28 Fév 2019 17:20
par Kebek
Pas de problème, merci d'avoir essayer de m'aider. Si je trouve solution à mon problème, je le posterai ici.
@+

Kebek

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

Publié : 04 Mars 2019 17:59
par zebilamouche
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.