これは保持しているために破棄されないキャンバスを持ち、スライダーはプログレスバーを表示します。また、ロードの進行状況が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
が最初にリリースされたとき
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class SceneLoader {
AsyncOperation operation;
string sceneName;
private Text txx =null;
private Slider slider=null;
public SceneLoader(){
}
public void setSliderAndTextToChange(Slider sl, Text tx){
txx = tx;
slider = sl;
}
public void setNewScene(string sceneName){
if (sceneName.Length == 0) {
throw new UnityException ("Please enter a name");
}
this.sceneName = sceneName;
}
public IEnumerator LoadAsynchron(string myMain, Button bttn){
operation = SceneManager.LoadSceneAsync (myMain);
operation.allowSceneActivation = false;
while (operation.isDone == false) {
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;
}
}
public AsyncOperation AsgetOP(){
return operation;
}
}
シーンをロードしているコードを投稿するべきだと思います。 – Programmer
@Programmer助けて欲しい – DYRtLAWWWOTS