示例#1
0
        /// <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
            });
        }
示例#2
0
 /// <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));
 }