Page 1 sur 1

[DB-AL] Missing Reference sur une variable static

Publié : 07 Jan 2019 19:48
par Badfly
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 :)

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

Publié : 07 Jan 2019 22:44
par Max
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 ?

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

Publié : 08 Jan 2019 15:09
par Badfly
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.

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

Publié : 08 Jan 2019 19:08
par Max
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 ?

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

Publié : 08 Jan 2019 20:33
par Badfly
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 ?

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

Publié : 08 Jan 2019 20:53
par Max
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é)

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

Publié : 09 Jan 2019 14:16
par Badfly
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 !

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

Publié : 14 Jan 2019 12:09
par Sebela
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 :)