Last active
March 28, 2024 22:25
-
-
Save Democide/beba5fd2603b268a8f72 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// LoadingScreenManager | |
// -------------------------------- | |
// built by Martin Nerurkar (http://www.martin.nerurkar.de) | |
// for Nowhere Prophet (http://www.noprophet.com) | |
// | |
// Licensed under GNU General Public License v3.0 | |
// http://www.gnu.org/licenses/gpl-3.0.txt | |
using UnityEngine; | |
using UnityEngine.UI; | |
using System.Collections; | |
using UnityEngine.SceneManagement; | |
public class LoadingScreenManager : MonoBehaviour { | |
[Header("Loading Visuals")] | |
public Image loadingIcon; | |
public Image loadingDoneIcon; | |
public Text loadingText; | |
public Image progressBar; | |
public Image fadeOverlay; | |
[Header("Timing Settings")] | |
public float waitOnLoadEnd = 0.25f; | |
public float fadeDuration = 0.25f; | |
[Header("Loading Settings")] | |
public LoadSceneMode loadSceneMode = LoadSceneMode.Single; | |
public ThreadPriority loadThreadPriority; | |
[Header("Other")] | |
// If loading additive, link to the cameras audio listener, to avoid multiple active audio listeners | |
public AudioListener audioListener; | |
AsyncOperation operation; | |
Scene currentScene; | |
public static int sceneToLoad = -1; | |
// IMPORTANT! This is the build index of your loading scene. You need to change this to match your actual scene index | |
static int loadingSceneIndex = 2; | |
public static void LoadScene(int levelNum) { | |
Application.backgroundLoadingPriority = ThreadPriority.High; | |
sceneToLoad = levelNum; | |
SceneManager.LoadScene(loadingSceneIndex); | |
} | |
void Start() { | |
if (sceneToLoad < 0) | |
return; | |
fadeOverlay.gameObject.SetActive(true); // Making sure it's on so that we can crossfade Alpha | |
currentScene = SceneManager.GetActiveScene(); | |
StartCoroutine(LoadAsync(sceneToLoad)); | |
} | |
private IEnumerator LoadAsync(int levelNum) { | |
ShowLoadingVisuals(); | |
yield return null; | |
FadeIn(); | |
StartOperation(levelNum); | |
float lastProgress = 0f; | |
// operation does not auto-activate scene, so it's stuck at 0.9 | |
while (DoneLoading() == false) { | |
yield return null; | |
if (Mathf.Approximately(operation.progress, lastProgress) == false) { | |
progressBar.fillAmount = operation.progress; | |
lastProgress = operation.progress; | |
} | |
} | |
if (loadSceneMode == LoadSceneMode.Additive) | |
audioListener.enabled = false; | |
ShowCompletionVisuals(); | |
yield return new WaitForSeconds(waitOnLoadEnd); | |
FadeOut(); | |
yield return new WaitForSeconds(fadeDuration); | |
if (loadSceneMode == LoadSceneMode.Additive) | |
SceneManager.UnloadScene(currentScene.name); | |
else | |
operation.allowSceneActivation = true; | |
} | |
private void StartOperation(int levelNum) { | |
Application.backgroundLoadingPriority = loadThreadPriority; | |
operation = SceneManager.LoadSceneAsync(levelNum, loadSceneMode); | |
if (loadSceneMode == LoadSceneMode.Single) | |
operation.allowSceneActivation = false; | |
} | |
private bool DoneLoading() { | |
return (loadSceneMode == LoadSceneMode.Additive && operation.isDone) || (loadSceneMode == LoadSceneMode.Single && operation.progress >= 0.9f); | |
} | |
void FadeIn() { | |
fadeOverlay.CrossFadeAlpha(0, fadeDuration, true); | |
} | |
void FadeOut() { | |
fadeOverlay.CrossFadeAlpha(1, fadeDuration, true); | |
} | |
void ShowLoadingVisuals() { | |
loadingIcon.gameObject.SetActive(true); | |
loadingDoneIcon.gameObject.SetActive(false); | |
progressBar.fillAmount = 0f; | |
loadingText.text = "LOADING..."; | |
} | |
void ShowCompletionVisuals() { | |
loadingIcon.gameObject.SetActive(false); | |
loadingDoneIcon.gameObject.SetActive(true); | |
progressBar.fillAmount = 1f; | |
loadingText.text = "LOADING DONE"; | |
} | |
} |
Keep going with such tutorials man! They're really helpful :)
Thanks man.
I recommend changing the line 40 for this
static string loadingSceneIndex = "NameOfLoadinScene";
because it not change if you change scene number, useful to many scene projects
ThankYou!
have u got a downloadable script for the 2nd one as well
I used this but it gets stuck on loading screen and won't fade in. Any suggestions?
thanks
Unity recommends using UnloadSceneAsync now. Use that instead of UnloadScene
I tried adding .gif and converted it to a sprite. Then assigned it to the LoadingIcon
but the animation of the gif doesn't seem to animate it when rendering the game! Any ideas?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Brilliant thank you, just what I needed. Will credit you in my University project.