using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;
using Oasis;
namespace Oasis
{
public class SceneLoader : MonoBehaviour
{
/// <summary>
/// Instance de SceneLoader
/// </summary>
private static SceneLoader _instance = null;
/// <summary>
/// Obtenir l'instance du SceneLoader
/// </summary>
/// <returns>L'instance du SceneLoader</returns>
private static SceneLoader GetInstance()
{
// si on a pas encore d'instance
if(SceneLoader._instance == null)
{
// on créé le gameObject à partir du prefab
GameObject sceneLoaderGo = PrefabManager.Instantiate("Prefabs/Lib/SceneLoader");
// on met à jour l'instance à partir du composant
SceneLoader.SetInstance(sceneLoaderGo.GetComponent<SceneLoader>());
}
return SceneLoader._instance;
}
/// <summary>
/// Fixer l'instance du SceneLoader
/// </summary>
/// <param name="sceneLoader">L'instance du SceneLoader</param>
private static void SetInstance(SceneLoader sceneLoader)
{
SceneLoader._instance = sceneLoader;
}
/// <summary>
/// Demarrer
/// </summary>
void Start()
{
// il ne faudra pas détruire cette objet car il va passer sur plusieur scene
DontDestroyOnLoad(this);
}
/// <summary>
/// méthode utilisé pour lancer la coroutine de chargement de scene.
/// </summary>
/// <param name="sceneName">Scene name.</param>
private void LaunchCoroutineLoadScene(string sceneName)
{
StartCoroutine(this.CoroutineLoadScene(sceneName));
}
/// <summary>
/// Coroutines utilisé pour charger la scene.
/// </summary>
/// <param name="sceneName">le nom de la scene a chargé.</param>
private IEnumerator CoroutineLoadScene(string sceneName)
{
// on charge la scene de chargement. on utilise un chargement async car cela permet que la scene precedente soit déchargé aprés que la nouvelle soit chargé
AsyncOperation loading = SceneManager.LoadSceneAsync("Loading");
// tant que la scene n'est pas chargé
while(!loading.isDone)
{
// on attend un petit peu
yield return new WaitForSeconds
(0
.1f
); }
// on charge la scene de maniére asynchrone
loading = SceneManager.LoadSceneAsync(sceneName);
// tant que la scene n'est pas chargé
while(!loading.isDone)
{
// on rempli la barre de chargement. on ajoute 0.1 car le loading.progress ne va que jusqu'a 0.9 et ca permet de ne pas avori de barre de chargement vide
LoadingBar.Fill(loading.progress + 0.1f);
// on attend un petit peu
yield return new WaitForSeconds
(0
.1f
); }
}
/// <summary>
/// charge une scene.
/// </summary>
/// <param name="sceneName">nom de la scene.</param>
public static void LoadScene(string sceneName)
{
SceneLoader.GetInstance().LaunchCoroutineLoadScene(sceneName);
}
}
}