[DB-AL] Missing Reference sur une variable static

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
Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

[DB-AL] Missing Reference sur une variable static

Message par Badfly » 07 Jan 2019 19:48

Bonjour à tous,

Voilà, j'ai un Script LevelManager avec une variable static Instance pour pouvoir faire appel à ce script n'importe où dans le jeu. Jusque là tout marche très bien. Ce script est sur un GameObject, que j'ai mis en DontDestroyOnLoad.

Le problème arrive quand je reload la scene et une erreur survient : "MissingReferenceException: The object of type 'LevelManager' has been destroyed but you are still trying to access it."

Cependant, dans l'inspector le LevelManager est bien présent.

Code : Tout sélectionner

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


public class LevelManager : MonoBehaviour {

    public static LevelManager Instance;

    public int level = 1;
    public Level levelLoad = null;

    private void Awake()
    {
        Instance = this;
        Init();
    }

    void Init()
    {
        level = PlayerPrefs.GetInt("Level", 1);
        Debug.Log("Start Level Manager");
        string _script_Name = "Level" + level.ToString();
        // On ajoute un component
        levelLoad = (Level)gameObject.AddComponent(Type.GetType(_script_Name)); // L'erreur arrive sur cette ligne
    }
(la fonction Init() est appelé quand la Scene à fini de charger)
L'erreur arrive quand je souhaite rajouter un Component au GameObject. Et malgré cette erreur, bah dans l'inspector je vois que le Component en question à bien été rajouté. Mais tout appel à levelLoad (le component rajouté) renverra null :

Code : Tout sélectionner

    public int Get_NbPaternNecessary()
    {
        if (levelLoad)
            return levelLoad.nb_Obstacle;
        else
        {
            Debug.Log("Level Manager ERROR : levelLoad not found");
            return -1;
        }
    }
Après un reload de la scène, cette fonction affichera le Debug alors que dans l'inspecteur la variable levelLoad est bien assigné au component.
(Je reprécise que tout marche parfaitement AVANT d'avoir reload la scène)

J'ai essayé de ne mettre que le code nécessaire, si j'ai oublié quelque chose n'hésitez pas.

Je vous remercie d'avance :)

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Missing Reference sur une variable static

Message par Max » 07 Jan 2019 22:44

Bonsoir,

Je ne suis pas sûr d'avoir compris les tenants et aboutissants. Mais un truc me fait tiquer, tu dis
Badfly a écrit :
07 Jan 2019 19:48
(la fonction Init() est appelé quand la Scene à fini de charger)
Mais tu l'as aussi dans ton Awake si j'ai bien lu, non ?
Image
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

Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

Re: [DB-AL] Missing Reference sur une variable static

Message par Badfly » 08 Jan 2019 15:09

Bonjour Max et merci de ta réponse.

Alors oui la fonction Init() est appelé par le Awake() mais c'est lors de la première partie. Lors d'un Reload de la Scene, je rappel en effet Init() car lors d'un Reload, Awake() n'est pas appelé. (Le LevelManager se trouve sur un gameObject DontDestroyOnLoad)

Voilà :) Et le problème en lui même, si je me suis mal exprimé, pour faire simple. J'ai une erreur où l'on me dit que le LevelManager n'existe pas, alors qu'il est présent et execute de code.

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Missing Reference sur une variable static

Message par Max » 08 Jan 2019 19:08

Hello,
Ce script est sur un GameObject, que j'ai mis en DontDestroyOnLoad.
donc sur ce GO tu as un autre script qui se charge du DontDestroyOnLoad j'imagine.
Après, si effectivement tu as bien la scene aditionnelle issue du DontDestroy dans ta Hierarchy, avec le go concerné, les bons scripts dessus, perso je ne vois pas trop avec les éléments donnée.

Si dans ton Init(), après le "levelLoad = (Level)...." tu met un Debug.Log(levelLoad); tu obtiens quoi ?
Image
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

Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

Re: [DB-AL] Missing Reference sur une variable static

Message par Badfly » 08 Jan 2019 20:33

Encore merci du temps que tu me consacre :)

Alors oui, en effet, c'est bien un autre script, sur le même GO qui défini le Dontdestroy. Et je vois en effet dans la hiérarchie la scène "parallèles" des Dontdestroy.

Si je met un Debug.Log(levelLoad) cela ne fonctionne pas. J'ai toujours le Missing Reference. Cette erreur provient justement de la ligne levelLoad = (Level)ga…

Donc le debug d'en dessous ne passe pas :(

Des idées ?

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Missing Reference sur une variable static

Message par Max » 08 Jan 2019 20:53

Badfly a écrit :
08 Jan 2019 20:33
Des idées ?
Là en l'état non, et sans avoir le projet sous les yeux, difficile d'en dire plus (peut-être que quelqu'un arrivera à voir le truc que j'ai zappé)
Image
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

Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

Re: [DB-AL] Missing Reference sur une variable static

Message par Badfly » 09 Jan 2019 14:16

Je te remercie quand même d'avoir essayé :)

Si quelqu'un d'autres veut s'y frotter à vous l'honneur :D

Et pour informations si je place le LevelManager sur un autre GameObject qui lui n'est pas dans un DontDestroy, tout marche bien !

Avatar de l’utilisateur
Sebela
Messages : 141
Inscription : 25 Juin 2014 21:39

Re: [DB-AL] Missing Reference sur une variable static

Message par Sebela » 14 Jan 2019 12:09

Hello Badfly !

Est-ce que ton gameObject est à la racine de ta scène ou est-il enfant d'un autre gameobject ? Si c'est le cas, le parent est probablement supprimé et supprime ton gameobject malgré le DontDestroyOnLoad.
Pour ton persistant singleton, essaye de le mettre en place de la façon suivante :

Code : Tout sélectionner

public class LevelManager {
	private static LevelManager _instance;
    	public static LevelManager Instance
    	{
        	get
        	{
            		if (_instance == null)
                	_instance = FindObjectOfType<LevelManager>();

            		return _instance;
        	}
    	}
    }
Comme ça si la référence n'existe pas, il va la chercher.
Redis-moi :)

Répondre

Revenir vers « (C#) CSharp »