/// <summary> /// Coroutine to load screen scene asynchronously /// </summary> /// <param name="screenType">Screen type</param> /// <param name="mode">Create screen mode</param> /// <param name="transition">Transition between screens</param> /// <param name="data">Data to send to the screen</param> /// <returns></returns> private IEnumerator _CreateScreen <TScreenType>(TScreenType screenType, CreateScreenMode mode, ScreenTransition transition, object data) where TScreenType : struct, IConvertible { //Check if type is an enum Type t = typeof(TScreenType); if (!t.IsEnum) { throw new Exception("Screen type is not an enumeration"); } //We can deduce the name of the scene from the screenType string screenName = screenType.ToString(CultureInfo.InvariantCulture); string scenePath = $"{CurrentThemePath}/{screenName}"; //Blocks interactions while loading if (_screenManager.NumberOfScreens != 0) { CurrentScreenGameObject.GetComponent <CanvasGroup>().blocksRaycasts = false; } //Show loading screen _ShowLoadingScreen(true); AsyncOperation asyncOp = SceneManager.LoadSceneAsync(scenePath, LoadSceneMode.Additive); while (!asyncOp.isDone) { yield return(new WaitForEndOfFrame()); } Scene loadedScene = SceneManager.GetSceneByName(screenName); while (!loadedScene.isLoaded) { yield return(new WaitForEndOfFrame()); } //Hide loading screen _ShowLoadingScreen(false); //Add scene to scene group _scenesRoots.Add(screenName, loadedScene.GetRootGameObjects()[0]); loadedScene.GetRootGameObjects()[0].name = screenName; loadedScene.GetRootGameObjects()[0].transform.SetParent(_scenesGroupGameObject.transform); //Play transition between screens yield return(_PlayScreenTransition(_scenesRoots[screenName], transition)); OnScreenSceneLoaded?.Invoke(this, new ScreenSceneLoadedEventArgs { LoadedScene = loadedScene, ScreenGameObject = _scenesRoots[screenName], Mode = mode, Screen = screenType, Transition = transition, Data = data }); }
/// <summary> /// Create a new screen for the application /// </summary> /// <param name="screenType">Screen type</param> /// <param name="mode">Create screen mode</param> /// <param name="transition">Transition between screens</param> /// <param name="data">Data to send to the screen</param> public void CreateScreen <TScreenType>(TScreenType screenType, CreateScreenMode mode, ScreenTransition transition = ScreenTransition.None, object data = null) where TScreenType : struct, IConvertible { StartCoroutine(_CreateScreen(screenType, mode, transition, data)); }