Search Unity

“SceneManager.activeSceneChanged” and “LoadSceneAsync” Issues

Discussion in 'Scripting' started by softmarshmallow, Jul 7, 2017.

  1. softmarshmallow

    softmarshmallow

    Joined:
    Jan 29, 2016
    Posts:
    7
    here is the original question.
    https://stackoverflow.com/questions...ync-and?noredirect=1#comment76901505_44948508



    first, there is a singleton object simply is subscribed to activeSceneChanged

    SomeSingleton.cs

    Code (CSharp):
    1. void Awake ()
    2. {
    3.     Debug.LogError ("AWAKE");
    4.  
    5.     if (instance == null) {
    6.         Debug.LogError ("instance == null");
    7.  
    8.         instance = this;
    9.         MusicController.instance = this;
    10.         SceneManager.activeSceneChanged += OnSceneChanged;
    11.         DontDestroyOnLoad (this.gameObject);
    12.     } else {
    13.         Debug.LogError ("destroy");
    14.  
    15.         Destroy (this.gameObject);
    16.     }
    17. }
    18.  
    19.  
    20. void OnSceneChanged (Scene previousScene, Scene changedScene)
    21. {
    22.     Debug.LogError ("OnSceneChanged changedScene = " + changedScene.name);
    23. }
    1. from Lobby Scene player moves to Room Scene.
    2. in room scene.
    the "Arena" Scene gets preloaded for better game experience.

    Code (CSharp):
    1. LoadSceneAsync("Arena")
    with
    Code (CSharp):
    1. allowSceneActivation = false
    when player clicks play button, sets allowSceneActivation = true

    but when user decides to go back and clicks Leave Button, LoadScene("Lobby") gets called.

    At this time in console, it will Log



    LOG

    Code (CSharp):
    1. OnSceneChanged changedScene = Lobby // time : 0.793
    2. OnSceneChanged changedScene = Room // time : 3.982
    [when player clicks Leave Button]

    Code (CSharp):
    1. OnSceneChanged changedScene = Arena // time : 7.583
    2. OnSceneChanged changedScene = Lobby // time : 7.583
    like this...

    it just gets activated but wont actually load the scene. why is Arena getting activatd? how to solve this problem??? should i do some unload thing to the AsyncLoading?


    + here are some more extra behind Logics.
    ======



    when leave button clicked

    Code (CSharp):
    1. public void LeaveRoom ()
    2. {
    3.     print ("Leave Room And Move To Lobby");
    4.     SetCanStartIfMasterClient (false);
    5.     PhotonNetwork.LeaveRoom ();
    6.     AdmobController.DestroyBanner ();
    7.     Waiting.instance.StartWaiting (waitingForLeaveRoomData);
    8.     SceneFader.instance.LoadSceneWhenFadingComplete (SceneType.Lobby);
    9. }

    in SceneFader.cs

    Code (CSharp):
    1. public enum SceneFadeType
    2. {
    3.     FadeIn = 1,
    4.     FadeOut = -1
    5. }
    6.  
    7.  
    8. public class SceneFader : MonoBehaviour
    9. {
    10.  
    11.     public static SceneFader instance;
    12.     void Awake ()
    13.     {
    14.         instance = this;
    15.  
    16.         // StartFadeOut
    17.         StartFading (SceneFadeType.FadeOut, null);
    18.  
    19.     }
    20.  
    21.  
    22.     public void LoadSceneWhenFadingComplete (SceneType sceneType)
    23.     {
    24.         // 1. start Fading
    25.         // 2. on fading complete, LoadScene
    26.         StartFading
    27.         (
    28.             fadeType: SceneFadeType.FadeIn,
    29.             onFadingComplete: () => {
    30.                 SceneManager.LoadScene (sceneType.ToString ());
    31.             }
    32.         );
    33.  
    34.     }
    35.  
    36.     public void LoadSceneWhenFadingCompleteAsync (ScenePreloader scenePreloader)
    37.     {
    38.         // 1 start preloading scene
    39.         // 2 on preloading complete, start fading
    40.         // 3 on fading complete LoadScene
    41.  
    42.  
    43.         scenePreloader.AddOnPreloadCompleteAndTriggerIfLoaded (
    44.             onPreloadComplete: () => {
    45.                 StartFading (
    46.                     fadeType: SceneFadeType.FadeIn,
    47.                     onFadingComplete: () => {
    48.                         scenePreloader.ActivateSceneWhenReady ();
    49.                     }
    50.                 );
    51.             }
    52.         );
    53.  
    54.     }
    55.  
    56.     private void StartFading (SceneFadeType fadeType, Action onFadingComplete)
    57.     {
    58.         Debug.LogWarning ("StartFAding ");
    59.         ScreenFader.instance.BeginFade (fadeType, onFadingComplete);
    60.         AudioMasterController.instance.StartFading (fadeType, null);
    61.     }
    62.  
    63.  
    64. }

    in ScenePreloader.cs

    Code (CSharp):
    1. public class ScenePreloader : MonoBehaviour
    2. {
    3.  
    4.     Action<float> onPreloadRateChanged;
    5.     Action onPreloadComplete;
    6.     public AsyncOperation sceneLoader;
    7.     public bool isPreloadCompleted;
    8.  
    9.  
    10.     public void StartPreloadingScene (SceneType sceneType, LoadSceneMode loadSceneMode, Action<float> onPreloadRateChanged = null, Action onPreloadComplete = null)
    11.     {
    12.         this.onPreloadComplete = onPreloadComplete;
    13.         this.onPreloadRateChanged = onPreloadRateChanged;
    14.         StartCoroutine (PreloadSceneOperation (sceneType, loadSceneMode));
    15.     }
    16.  
    17.  
    18.     public IEnumerator PreloadSceneOperation (SceneType sceneType, LoadSceneMode loadSceneMode = LoadSceneMode.Single)
    19.     {
    20.         print ("PreloadSceneOperation sceneType = " + sceneType.ToString ());
    21.         sceneLoader = SceneManager.LoadSceneAsync (sceneType.ToString (), loadSceneMode);
    22.         sceneLoader.allowSceneActivation = false;
    23.  
    24.         while (!sceneLoader.isDone) {
    25.             yield return null;
    26.             if (sceneLoader.progress >= 0.9f) {
    27.                 print ("onPreloadComplete");
    28.                 isPreloadCompleted = true;
    29.                 if (onPreloadComplete != null) {
    30.                     onPreloadComplete ();
    31.                 }
    32.                 break;
    33.             } else {
    34.                 if (onPreloadRateChanged != null) {
    35.                     onPreloadRateChanged (sceneLoader.progress);
    36.                 }
    37.             }
    38.         }
    39.     }
    40.  
    41.     public void ActivateSceneWhenReady ()
    42.     {
    43.  
    44.         sceneLoader.allowSceneActivation = true;
    45.  
    46.     }
    47.  
    48.  
    49.     public void AddOnPreloadCompleteAndTriggerIfLoaded (Action onPreloadComplete)
    50.     {
    51.         AddOnPreloadComplete (onPreloadComplete);
    52.         if (isPreloadCompleted) {
    53.             print ("isAlreadyLoadedTrigeringCallback");
    54.             onPreloadComplete ();
    55.         }
    56.     }
    57.  
    58.     public void AddOnPreloadComplete (Action onPreloadComplete)
    59.     {
    60.         this.onPreloadComplete += onPreloadComplete;
    61.     }
    62.  
    63.     public void SetOnLoadProgressValueChanged (Action<float> onLoadProgressValueChanged)
    64.     {
    65.         this.onPreloadRateChanged = onLoadProgressValueChanged;
    66.     }
    67.  
    68.  
    69. }


    Help this poor guy!!
     
  2. softmarshmallow

    softmarshmallow

    Joined:
    Jan 29, 2016
    Posts:
    7
    @Unity

    do you guys have solution for this?