using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; using System; public class GameManager : MonoBehaviour { public static GameManager instance; [SerializeField] private Fade fade;//遮罩 [SerializeField] private Text loadText;//加载文字 [SerializeField] private Image loadBar; //载入条 [SerializeField] private String firstSceneName; [SerializeField] private Camera _loadingCamera; private bool isLodaingScene; // 是否处于加载Scene的过程中 private void Awake() { if (instance) { Destroy(this.gameObject); } else { instance = this; } } private void Start() { StartCoroutine(ChangeScene(firstSceneName)); } /// <summary> /// 加载并切换到新的场景 /// </summary> /// <param name="sceneName">场景名字</param> public void SwitchScene(string sceneName) { StartCoroutine(ChangeScene(sceneName)); } /// <summary> /// 加载场景的协程 /// </summary> /// <param name="sceneName"></param> /// <returns></returns> private IEnumerator ChangeScene(string sceneName) { isLodaingScene = true; // 如果有别的场景在,就先淡出 if (SceneManager.sceneCount >= 2) { fade.gameObject.SetActive(true); yield return fade.FadeOut(); } // 先释放掉其他的场景 while (SceneManager.sceneCount >= 2) { yield return SceneManager.UnloadSceneAsync(SceneManager.GetSceneAt(SceneManager.sceneCount - 1)); } // 然后开始加载新场景 yield return LoadSceneAsync(sceneName); isLodaingScene = false; // 加载完成后淡入 yield return fade.FadeIn(); fade.gameObject.SetActive(false); } /// <summary> /// 异步加载一个场景 /// </summary> /// <param name="sceneName">需要加载的场景名</param> /// <returns></returns> private IEnumerator LoadSceneAsync(string sceneName) { int displayProgress = 0; int toProgress = 0; setLoadingEffct(true); AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive); asyncOperation.allowSceneActivation = false;//暂时不激活加载的场景 //显示加载进度,将进度平缓显示 while (asyncOperation.progress < 0.9f) { toProgress = (int)asyncOperation.progress * 100; while (displayProgress < toProgress) { ++displayProgress; SetLoadingPercentage(displayProgress); yield return new WaitForEndOfFrame(); } } toProgress = 100;//将进度强行显示100,并平缓过度 while (displayProgress < toProgress) { ++displayProgress; SetLoadingPercentage(displayProgress); yield return new WaitForEndOfFrame(); } //激活加载场景 asyncOperation.allowSceneActivation = true; yield return new WaitForSeconds(1f);//等待1秒钟 yield return asyncOperation.isDone;//等待场景完成返回值 //将场景设为活动场景 SceneManager.SetActiveScene(SceneManager.GetSceneByName(sceneName)); setLoadingEffct(false); } /// <summary> /// 显示加载值 /// </summary> /// <param name="progress"></param> void SetLoadingPercentage(int progress) { loadText.text = progress + "%"; loadBar.fillAmount = progress / 100f; } /// <summary> /// 开启与关闭加载文字和读条 /// </summary> /// <param name="flag"></param> void setLoadingEffct(bool flag) { _loadingCamera.enabled = flag; _loadingCamera.GetComponent<AudioListener>().enabled = flag; loadText.enabled = flag; loadBar.enabled = flag; } }