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