Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 切换场景时,旧场景仍会短时间出现_C#_Unity3d_Canvas_Unity5 - Fatal编程技术网

C# 切换场景时,旧场景仍会短时间出现

C# 切换场景时,旧场景仍会短时间出现,c#,unity3d,canvas,unity5,C#,Unity3d,Canvas,Unity5,所以我有一个画布,它不会被破坏,因为它可以保存和滑动,它显示一个进度条。它还有一个按钮,当加载进度为0.9时可进行交互。。我遇到的问题是当我单击按钮时(请参见activateNewScene())。基本上,当我点击按钮时,我加载场景并禁用画布。但问题是,禁用画布后,旧场景仍会显示约0.5秒,然后加载新场景。我想要的是,在画布被禁用后,新场景应该出现。短时间看不到旧的场景 using System.Collections; using System.Collections.Generic;

所以我有一个画布,它不会被破坏,因为它可以保存和滑动,它显示一个进度条。它还有一个按钮,当加载进度为0.9时可进行交互。。我遇到的问题是当我单击按钮时(请参见activateNewScene())。基本上,当我点击按钮时,我加载场景并禁用画布。但问题是,禁用画布后,旧场景仍会显示约0.5秒,然后加载新场景。我想要的是,在画布被禁用后,新场景应该出现。短时间看不到旧的场景

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;

 public class SceneLoaderGameObject : MonoBehaviour {

 private SceneLoader sl;
 public Canvas cav;

 void Start () {
     sl = new SceneLoader ();
     cav.GetComponent<Canvas> ().enabled = false;
     DontDestroyOnLoad (this.gameObject);
     DontDestroyOnLoad (cav.transform.parent);
 }

 public void setNewNameAndLoadScene(string name){

     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;
         cav.GetComponent<Canvas> ().sortingOrder = 1;

         StartCoroutine (sl.LoadAsynchron (name, bttn));

     }

 }

 public void  activateNewScene(){
     sl.AsgetOP().allowSceneActivation=true;
     cav.GetComponent<Canvas> ().sortingOrder = 1;
     cav.GetComponent<Canvas> ().enabled = false;
 }

}

SceneManager
首次发布时,已知
isDone
仅在满足两个条件时才为真:

1。场景加载完成后

2。激活场景时

我不知道这是否仍然是真的,但我会假设它是真的

基本上,当您将
allowSceneActivation
设置为
false
时,不满足条件
2
,您将遇到问题。它看起来像
而(operation.isDone==false)
仍将执行,导致
bttn.interactiable=true也将执行每一帧。这是我的猜测

while(operation.isDone==false)
替换为
while(operation.progress<0.9f)
然后添加
bttn.interactiable=true到该函数的结尾,以防万一

public IEnumerator LoadAsynchron(string myMain, Button bttn)
{
    operation = SceneManager.LoadSceneAsync(myMain);
    operation.allowSceneActivation = false;
    while (operation.progress < 0.9f)
    {
        float progress = Mathf.Clamp01(operation.progress / 0.9f);
        slider.value = progress;
        txx.text = progress * 100f + " %";
        if (progress * 100f == 100f)
        {
            bttn.interactable = true;
        }
        yield return null;
    }
    if (!bttn.interactable)
        bttn.interactable = true;
}
公共IEnumerator LoadAsynchron(字符串myMain,按钮bttn) { operation=SceneManager.LoadSceneAsync(myMain); operation.allowSceneActivation=false; 同时(操作进度<0.9f) { 浮动进度=数学夹具01(操作进度/0.9f); slider.value=进度; txx.text=进度*100f+“%”; 如果(进度*100f==100f) { bttn.interactiable=true; } 收益返回空; } 如果(!bttn.可交互) bttn.interactiable=true; }


如果不起作用,我建议您使用
SceneManager.SetActiveScene
函数。请参阅post中的
启用场景
功能。我也看到了这方面的错误,如果这仍然是一个问题,您可能需要从编辑器中提交错误报告。

SceneManager
首次发布时,已知
isDone
仅在满足两个条件时才有效:

1。场景加载完成后

2。激活场景时

我不知道这是否仍然是真的,但我会假设它是真的

基本上,当您将
allowSceneActivation
设置为
false
时,不满足条件
2
,您将遇到问题。它看起来像
而(operation.isDone==false)
仍将执行,导致
bttn.interactiable=true也将执行每一帧。这是我的猜测

while(operation.isDone==false)
替换为
while(operation.progress<0.9f)
然后添加
bttn.interactiable=true到该函数的结尾,以防万一

public IEnumerator LoadAsynchron(string myMain, Button bttn)
{
    operation = SceneManager.LoadSceneAsync(myMain);
    operation.allowSceneActivation = false;
    while (operation.progress < 0.9f)
    {
        float progress = Mathf.Clamp01(operation.progress / 0.9f);
        slider.value = progress;
        txx.text = progress * 100f + " %";
        if (progress * 100f == 100f)
        {
            bttn.interactable = true;
        }
        yield return null;
    }
    if (!bttn.interactable)
        bttn.interactable = true;
}
公共IEnumerator LoadAsynchron(字符串myMain,按钮bttn) { operation=SceneManager.LoadSceneAsync(myMain); operation.allowSceneActivation=false; 同时(操作进度<0.9f) { 浮动进度=数学夹具01(操作进度/0.9f); slider.value=进度; txx.text=进度*100f+“%”; 如果(进度*100f==100f) { bttn.interactiable=true; } 收益返回空; } 如果(!bttn.可交互) bttn.interactiable=true; }


如果不起作用,我建议您使用
SceneManager.SetActiveScene
函数。请参阅post中的
启用场景
功能。我也看到了这方面的错误,如果这仍然是一个问题,您可能需要从编辑器中提交错误报告。

我明白了。我想这是因为画布。尝试将代码放在禁用画布的位置,并在函数onlevelwasload中将顺序设置为0。所以基本上是这样的:

void OnLevelWasLoaded(){
    cav.GetComponent<Canvas> ().sortingOrder = 0;
    cav.GetComponent<Canvas> ().enabled = false;
}
public void  activateNewScene(string name){
    sl.AsgetOP ().allowSceneActivation = true;

    Scene sc = SceneManager.GetSceneByName(name);
    if (sc.IsValid ()) {
            SceneManager.SetActiveScene(sc);

    }

}
void onlevelwasload(){
cav.GetComponent().sortingOrder=0;
cav.GetComponent().enabled=false;
}
public void activateNewScene(字符串名称){
sl.AsgetOP().allowSceneActivation=true;
场景sc=SceneManager.GetSceneByName(名称);
if(sc.IsValid()){
SceneManager.SetActiveScene(sc);
}
}

我将场景名称添加到函数中以激活它

我明白了。我想这是因为画布。尝试将代码放在禁用画布的位置,并在函数onlevelwasload中将顺序设置为0。所以基本上是这样的:

void OnLevelWasLoaded(){
    cav.GetComponent<Canvas> ().sortingOrder = 0;
    cav.GetComponent<Canvas> ().enabled = false;
}
public void  activateNewScene(string name){
    sl.AsgetOP ().allowSceneActivation = true;

    Scene sc = SceneManager.GetSceneByName(name);
    if (sc.IsValid ()) {
            SceneManager.SetActiveScene(sc);

    }

}
void onlevelwasload(){
cav.GetComponent().sortingOrder=0;
cav.GetComponent().enabled=false;
}
public void activateNewScene(字符串名称){
sl.AsgetOP().allowSceneActivation=true;
场景sc=SceneManager.GetSceneByName(名称);
if(sc.IsValid()){
SceneManager.SetActiveScene(sc);
}
}

我将场景名称添加到函数中以激活它

我认为您应该发布加载场景的代码。@程序员希望它有帮助我认为您应该发布加载场景的代码。@程序员希望它有帮助您的Unity版本是什么?我的版本是5.6.1,更新到2017年。如果问题仍然存在,那么像我在回答中所说的那样提交错误报告。你的Unity版本是什么?我的版本是5.6.1,更新到2017年。如果问题仍然存在,那么像我在回答中所说的那样提交错误报告。