C# 画布在新场景中加载后无法启用它
因此,我有一个游戏对象,在必要时加载新场景。附加到游戏对象的脚本有一个变量,该变量保存对canvas元素的引用(canvas元素有一个progressbar)。问题是,在我加载一个新场景并希望在加载的场景中加载一个新场景后,我丢失了对canvas对象的引用,因为我无法将其设置为DontDestroyOnLoad 我所做的是将canvas元素(请参见start function()中的注释行)作为游戏对象的子元素,该子元素不会被破坏。。完成此操作后,我没有收到丢失对象引用的警告,但它不会在setNewNameAndLoadScene()函数中启用画布 我使用enable的意思是gui不会出现在屏幕上,但它是在Hirarch中。我检查了它是否为空,而不是空。程序在代码行中运行没有问题,但画布不会出现在游戏屏幕上 第二次编辑:我刚刚检查了(在运行时)如果我把我的画布(它是我游戏对象的子对象)放在新加载场景的画布中会发生什么。发生的事情是它显示了我的画布。但我要问的是,当我把它放到场景画布上时,为什么它会显示出来。在加载第一个场景之前,我的画布不在场景画布中,但仍在游戏屏幕中显示进度条C# 画布在新场景中加载后无法启用它,c#,unity3d,canvas,object-reference,C#,Unity3d,Canvas,Object Reference,因此,我有一个游戏对象,在必要时加载新场景。附加到游戏对象的脚本有一个变量,该变量保存对canvas元素的引用(canvas元素有一个progressbar)。问题是,在我加载一个新场景并希望在加载的场景中加载一个新场景后,我丢失了对canvas对象的引用,因为我无法将其设置为DontDestroyOnLoad 我所做的是将canvas元素(请参见start function()中的注释行)作为游戏对象的子元素,该子元素不会被破坏。。完成此操作后,我没有收到丢失对象引用的警告,但它不会在setN
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);
}