所以我有一个游戏对象,可以在必要时加载新场景。附加到游戏对象的脚本有一个变量,它保存对 Canvas 元素的引用( Canvas 元素有一个进度条)。问题是,在我加载一个新场景后,我想在那个加载的场景中加载一个新场景,我失去了对 Canvas 对象的引用,因为我无法将他设置为 DontDestroyOnLoad。
我所做的是将 canvas 元素(参见 start function() 中的注释行)作为 gameobject 的子元素,它不会被破坏。完成之后我没有收到警告我丢失了对象引用,但它不会在 setNewNameAndLoadScene() 函数中启用 Canvas 。
启用的意思是 gui 不会出现在屏幕上,但它位于层次结构中。我检查了它是否为 null 而不是。该程序通过代码行运行没有问题,但 Canvas 没有出现在游戏屏幕上。
第二次编辑:我刚刚检查(在运行时)如果我将我的 Canvas (它是我的游戏对象的 child )放在新加载场景的 Canvas 中会怎样。发生的事情是它展示了我的 Canvas 。但是我问我为什么当我把它放到场景 Canvas 中时它会显示它。在我加载我的第一个场景之前,我的 Canvas 不在场景 Canvas 中,但仍然在游戏屏幕中显示了进度条
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;
}
}
最佳答案
只需使用下面的代码来制作单例并获取 slider 的公共(public) GameObject 引用或您想要在场景加载时激活-停用的任何内容。例如,如果您有控制 Canvas 组件的游戏管理器,请将单例对象和引用对象设为彼此。代码来源是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);
}
关于c# - Canvas 在新场景中加载后不会启用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45786037/