2017-08-20 3 views
2

J'ai donc un gameobject qui charge de nouvelles scènes quand nessesarry. Le script attaché à l'objet de jeu a une variable qui contient la référence à un élément canvas (l'élément canvas a une barre de progression). Le problème est qu'après avoir chargé une nouvelle scène et que je veux charger une nouvelle scène dans cette scène chargée, je perds la référence à l'objet canvas parce que je ne peux pas le définir sur DontDestroyOnLoad. Ce que j'ai fait c'est de mettre l'élément canvas (voir la ligne commentée dans start function()) en tant qu'enfant de l'objet gameobject qui n'est pas détruit .. Après avoir fait cela, je ne reçois pas l'avertissement que j'ai perdu la référence d'objet MAIS elle ne va pas activer le canevas dans la fonction setNewNameAndLoadScene(). Ce que je veux dire par activer, c'est que le GUI n'apparaîtra pas à l'écran mais qu'il est dans la hiérarchie. J'ai vérifié s'il est nul ce qu'il n'était pas. Le programme passe par la ligne de code sans problème mais la toile n'apparaît pas sur l'écran de jeu.Toile ne l'activera pas après avoir été chargé dans une nouvelle scène

2ème EDIT: Je viens de vérifier (pendant l'exécution) ce qui si je mets mon canevas (qui est un enfant de mon gameobject) dans le canevas de la nouvelle scène chargée. ce qui est arrivé est qu'il a montré ma toile. mais ce que je me demande pourquoi le montre-t-il quand je le mets dans la toile de la scène? avant chargé ma première scène ma toile était pas dans la toile de la scène, mais a encore montré la barre de progression dans le gamescreen

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

public class SceneLoaderGameObject : MonoBehaviour { 


private SceneLoader sl; 
public Canvas cav; //loses reference when loading new scene 

void Start() { 
    sl = new SceneLoader(); 
    cav.GetComponent<Canvas>().enabled = false; 
    DontDestroyOnLoad (this.gameObject); 
    DontDestroyOnLoad (this); 
    DontDestroyOnLoad (this.gameObject.transform.GetChild(0).GetComponent<Canvas>()); 
} 

public void setNewNameAndLoadScene(string name){ 

    if(name.Length ==0) 
     throw new UnityException("length 0"); 

    if (cav != null) { 
     Slider slid = cav.transform.GetChild (1).GetComponent<Slider>(); 
     Text tx = cav.transform.GetChild (2).GetComponent<Text>(); 
     Button bttn = cav.transform.GetChild (3).GetComponent<Button>(); 

     sl.setNewScene (name); 
     sl.setSliderAndTextToChange (slid, tx); 
     bttn.onClick.AddListener (() => activateNewScene()); 
     cav.GetComponent<Canvas>().enabled = true; 
     StartCoroutine (sl.LoadAsynchron (name, bttn)); 

    } 

} 

public void activateNewScene(){ 
    sl.AsgetOP().allowSceneActivation=true; 

} 
} 
+1

Veuillez être détaillé dans votre question. Que voulez-vous dire par "ne permettra pas"? Utilisez 'Debug.Log' pour voir ce qui se passe exactement. Vérifiez si la variable de canevas est null. Vérifiez dans l'éditeur et dites-nous si l'objet Canvas est toujours présent dans la hiérarchie. Ajoutez-les à votre question. Aidez-nous à vous aider. – Programmer

+0

@Programmer Hope it hels – TiZaLjubavNisiRodjena

+0

@Programmer Ou est-il possible de ne pas perdre de référence à ma toile. Donc, je ne dois pas en faire un enfant. donc je peux l'utiliser toujours comme une variable sauvegardée que j'active/désactive car c'est une toile – TiZaLjubavNisiRodjena

Répondre

1

utiliser simplement le code ci-dessous pour faire singletons et obtenir des références de gameobject publiques d'un curseurs ou ce que vous voulez activer-désactiver lors du chargement de la scène. Par exemple, si vous avez un gestionnaire de jeu qui contrôle les composants du canevas, créez des objets singleton et des objets de référence les uns par rapport aux autres. La source du code est here.

public class SceneLoaderSingleton : MonoBehaviour 
{ 

    //Static instance of SceneLoaderSingleton which allows it to be accessed by any other script. 
    public static SceneLoaderGameObject instance = null;  

    //Awake is always called before any Start functions 
    void Awake() 
    { 
     //Check if instance already exists 
     if (instance == null) 

      //if not, set instance to this 
      instance = this; 

     //If instance already exists and it's not this: 
     else if (instance != this) 

      //Then destroy this. This enforces singleton pattern, meaning there can only ever be one instance of a SceneLoaderSingleton. 
      Destroy(gameObject);  

     //Sets this to not be destroyed when reloading scene 
     DontDestroyOnLoad(gameObject);    
    }