c# - Canvas 在新场景中加载后不会启用它

标签 c# unity3d canvas object-reference

所以我有一个游戏对象,可以在必要时加载新场景。附加到游戏对象的脚本有一个变量,它保存对 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/

相关文章:

c# - 拼字游戏查找器 : building a trie, 存储一个 trie,使用一个 trie?

android - Android 中的 Unity3D 音频延迟

c# - 在 Unity 运行时删除重复的顶点

C# 64 位版本构建在没有调试的情况下启动时的行为与在调试时启动时的行为不同 (BigInteger)

c# - 具有 key (PK)的实体将不会往返

c# - 检查列表中已删除的插槽

android - unity CommandInvokationFailure : Unable to install APK to device. 权限被拒绝

javascript - HTML5 Canvas : Replace Cursor with Crossing Lines

javascript - 在没有 .toDataUrl() 的情况下将 Canvas 下载为图像

javascript - 在 Fabric.js 中用鼠标旋转东西的正确方法