gather-and-defend/Assets/Scripts/LoadingManager.cs
Felix Boucher 9e07c48fd4 ajout de transition avant de loader le level
besoin :

- le level était loadé directement au moment de cliquer dans le level selector ce qui n'est pas très fenshui

solution :

- fade out avec nuages
- les tuiles tombent à leur place au lieu d'apparaitre toutes en même temps
2023-10-01 21:48:35 -04:00

81 lines
2.5 KiB
C#

using System.Collections;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.SceneManagement;
/// <summary>
/// manages the logic of loading
/// </summary>
public class LoadingManager : MonoBehaviour
{
public const string LevelToLoad = nameof(LevelToLoad);
public const string SceneToLoad = nameof(SceneToLoad);
public const int NoLevel = -1;
private LoadingScreen loadingScreen;
public float testAddedTime = 5;
void Start()
{
loadingScreen = GetComponent<LoadingScreen>();
loadingScreen.ScreenActivated += StartLoadingGameScene;
loadingScreen.ShowLoadingScreen();
}
private void StartLoadingGameScene()
{
StartCoroutine(LoadSceneAfterTime());
IEnumerator LoadSceneAfterTime()
{
yield return new WaitForSeconds(testAddedTime);
loadingScreen.ScreenActivated -= StartLoadingGameScene;
SceneManager.sceneLoaded += StartHidingLoadingScreen;
var sceneToLoad = PlayerPrefs.GetString(SceneToLoad);
//unload all scenes except loading screen
for (int i = 0; i < SceneManager.sceneCount; i++)
{
var scene = SceneManager.GetSceneAt(i);
if (scene.name == gameObject.scene.name) continue;
SceneManager.UnloadSceneAsync(scene.name);
}
SceneManager.LoadScene(sceneToLoad, LoadSceneMode.Additive);
}
}
private void StartHidingLoadingScreen(Scene arg0, LoadSceneMode arg1)
{
SceneManager.sceneLoaded -= StartHidingLoadingScreen;
loadingScreen.ScreenDeactivated += StartLoadingLevel;
loadingScreen.HideLoadingScreen();
}
private async void StartLoadingLevel()
{
loadingScreen.ScreenDeactivated -= StartLoadingLevel;
LevelManager.Instance.LevelLoaded += UnloadLoadingScreenScene;
var levelToLoad = PlayerPrefs.GetInt(LevelToLoad, NoLevel);
if (levelToLoad == NoLevel)
{
UnloadLoadingScreenScene(null);
}
else
{
string lvlName = $"Level{levelToLoad}";
await LevelManager.Instance.LoadLevel(lvlName, true, LevelManagerScript.PlacementAnimation);
}
}
private void UnloadLoadingScreenScene(GatherAndDefend.LevelEditor.Level level)
{
LevelManager.Instance.LevelLoaded -= UnloadLoadingScreenScene;
SceneManager.UnloadSceneAsync(gameObject.scene.name);
}
}