当前位置: 首页 > 知识库问答 >
问题:

画布在加载到新场景后无法启用

公冶嘉
2023-03-14

所以我有一个游戏对象,它会在必要时加载新场景。附加到游戏对象的脚本有一个变量,该变量保存对画布元素的引用(画布元素有一个进度条)。问题是,在我加载一个新场景并且我想在加载的场景中加载一个新场景后,我失去了对画布对象的引用,因为我无法将他设置为DontDestRoyOnLoad。

我所做的是我把画布元素(参见start函数()中的注释行)作为游戏对象的子元素,它不会被销毁...在我这样做之后,我没有收到我已经丢失对象引用的警告,但它不会在setNewNameAndLoadScene()函数中启用画布。

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

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

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个答案

汤嘉平
2023-03-14

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

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);            
    }
 类似资料:
  • 问题内容: 我有2个fxml文件: 布局(标题,菜单栏和内容) Anchorpane(应该放在另一个fxml文件的内容中) 我想知道如何从“主”场景将第二个文件加载到内容空间内。在javaFX中工作是一件好事,还是加载一个新场景更好? 我正在尝试做这样的事情,但是不起作用: 谢谢您的帮助。 问题答案: 为什么您的代码不起作用 加载程序会创建一个新的AnchorPane,但是您绝不会将新窗格添加到场

  • null 我正试着做这样的事情,但它不起作用: 谢谢你的帮助。

  • 每当我试图从Intellij用scenebuilder打开一个fxml文件时,它会给我以下信息: (我已经从设置放入了场景构建器的路径)

  • 问题内容: 我正在构建JavaFX应用程序,我想知道是否有关于如何尽快加载当前新内容的建议(最佳实践)。 当前我正在做的(或多或少)是这样的: 对于加载简单的s,es等的复杂场景而言,上面的方法对于简单的s BUT 来说足够好且快速。 我在的方法中进行的所有初始化。 在那里,我将项目添加到框中,进行初始化等,但是正如我所说的,这花费了太多时间。 难道我做错了什么?我应该在其他地方初始化吗? 谢谢。

  • 我正在netbeans中开发JavaFx应用程序,在netbeans中该项目正在构建并运行良好。 加载屏幕的屏幕控制器: 我的github回购:https://github.com/eszikk/examsupervisorserver

  • 我的程序有两个场景,,每个都有相应的控制器类。 我希望能够使用Stage的在我的秒控制器类上,在它使用Button的onAction事件和FXMLLoader加载到FirstController类之后。 这是我在秒控制器类上的代码片段: 基于我的第一个控制器类上的,其中的值是一个字符串。 然而,这会输出一个错误: 然后,在第一个控制器类加载第二个控制器类之后,如何在其上使用?