using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; public class LoadingScreen : MonoBehaviour { public static LoadingScreen instance {get; private set;} [SerializeField]private Image loadingProgress; [SerializeField]private Text loadingProgressTxt; void Awake(){ if(instance != null){Destroy(gameObject);return;} instance =this; canvasGroup = GetComponent(); Application.targetFrameRate = 60; } void Start() { DontDestroyOnLoad(gameObject); } public static void LoadLevel(string levelName){ if(instance==null){Debug.LogError("No loading screen found, Raw load"); SceneManager.LoadScene(levelName); return;} instance.loadLevel(levelName); } public void loadLevel(string levelName){ if (loading) { return; } loading = true; StartCoroutine(_loadlLevel(levelName)); } public static bool loading {get; private set;} private CanvasGroup canvasGroup; IEnumerator _loadlLevel(string levelName) { // AudioManager.instnace.SetMusic(-1); loading = true; canvasGroup.alpha = 0; canvasGroup.blocksRaycasts = true; SetProgress(0); while (canvasGroup.alpha < 1f) { canvasGroup.alpha += 0.03f; yield return new WaitForFixedUpdate(); } AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(levelName); while (!asyncOperation.isDone) { SetProgress(asyncOperation.progress); yield return null; } Debug.Log("Loaded scene " + levelName); // yield return new WaitForSecondsRealtime(2f); while(loadingProgress.fillAmount < 1){ SetProgress( loadingProgress.fillAmount+0.01f); yield return new WaitForSeconds(0.1f); } canvasGroup.blocksRaycasts = false; while (canvasGroup.alpha > 0) { canvasGroup.alpha -= 0.03f; yield return new WaitForSecondsRealtime(0.015f); } Debug.Log("Loading scene vanishing"); loading = false; } void SetProgress(float value) { loadingProgress.fillAmount = value; loadingProgressTxt.text = (int)(value * 100) + "%"; } }