C# 画布在新场景中加载后无法启用它

C# 画布在新场景中加载后无法启用它,c#,unity3d,canvas,object-reference,C#,Unity3d,Canvas,Object Reference,因此,我有一个游戏对象,在必要时加载新场景。附加到游戏对象的脚本有一个变量,该变量保存对canvas元素的引用(canvas元素有一个progressbar)。问题是,在我加载一个新场景并希望在加载的场景中加载一个新场景后,我丢失了对canvas对象的引用,因为我无法将其设置为DontDestroyOnLoad 我所做的是将canvas元素(请参见start function()中的注释行)作为游戏对象的子元素,该子元素不会被破坏。。完成此操作后,我没有收到丢失对象引用的警告,但它不会在setN

因此,我有一个游戏对象,在必要时加载新场景。附加到游戏对象的脚本有一个变量,该变量保存对canvas元素的引用(canvas元素有一个progressbar)。问题是,在我加载一个新场景并希望在加载的场景中加载一个新场景后,我丢失了对canvas对象的引用,因为我无法将其设置为DontDestroyOnLoad

我所做的是将canvas元素(请参见start function()中的注释行)作为游戏对象的子元素,该子元素不会被破坏。。完成此操作后,我没有收到丢失对象引用的警告,但它不会在setNewNameAndLoadScene()函数中启用画布

我使用enable的意思是gui不会出现在屏幕上,但它是在Hirarch中。我检查了它是否为空,而不是空。程序在代码行中运行没有问题,但画布不会出现在游戏屏幕上

第二次编辑:我刚刚检查了(在运行时)如果我把我的画布(它是我游戏对象的子对象)放在新加载场景的画布中会发生什么。发生的事情是它显示了我的画布。但我要问的是,当我把它放到场景画布上时,为什么它会显示出来。在加载第一个场景之前,我的画布不在场景画布中,但仍在游戏屏幕中显示进度条

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;

 }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.UI;
公共类SceneLoaderGameObject:MonoBehavior{
私家影院;
public Canvas cav;//加载新场景时丢失引用
无效开始(){
sl=新的场景阅读器();
cav.GetComponent().enabled=false;
DontDestroyOnLoad(this.gameObject);
DontDestroyOnLoad(此);
DontDestroyOnLoad(this.gameObject.transform.GetChild(0.GetComponent());
}
public void setNewNameAndLoadScene(字符串名称){
如果(name.Length==0)
抛出新的UnityException(“长度0”);
如果(cav!=null){
Slider=cav.transform.GetChild(1.GetComponent();
Text tx=cav.transform.GetChild(2.GetComponent();
按钮bttn=cav.transform.GetChild(3.GetComponent();
sl.setNewScene(名称);
sl.SetSlide和TextToChange(滑动,tx);
bttn.onClick.AddListener(()=>activateNewScene());
cav.GetComponent().enabled=true;
start例程(sl.LoadAsynchron(名称,bttn));
}
}
public void activateNewScene(){
sl.AsgetOP().allowSceneActivation=true;
}
}

只需使用下面的代码制作单件游戏,并获取滑块的公共游戏对象引用,或在加载场景时激活或停用任何你想要激活的对象。例如,如果您有控制画布组件的游戏管理器,则将单例对象和引用对象彼此关联。源代码是


请详细回答你的问题。“不会启用”是什么意思?使用
Debug.Log
查看到底发生了什么。检查canvas变量是否为null。检查编辑器并告诉我们画布对象是否仍在层次结构中。把这些添加到你的问题中。帮助我们帮助你,希望如此hels@Programmer或者是否有可能不丢失对我画布的引用。所以我不必让它成为一个孩子。所以我可以像使用保存的变量一样使用它,启用/禁用它,因为它是画布
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);            
    }