Асинхронная загрузка сцены в Unity3D не работает - PullRequest
2 голосов
/ 03 апреля 2019

Итак, я провел некоторое исследование о том, как загрузка сцен асинхронно работает на единстве.До сих пор я нашел два очень похожих способа, которые основаны на одном и том же принципе.

   StartCoroutiune(loadScene());

    private AsyncOperation async;

     // ...

    IEnumerator loadScene(){
          async = SceneManager.LoadAsyncScene("Scene", LoadSceneMode.Single);
            async.allowSceneActivation = false;
            while(async.progress < 0.9f){
                  progressText.text = async.progress+"";
            }
           while(!async.isDone){
                  yield return null;
            }

    }

    public void showScene(){
     async.allowSceneActivation = true;
    }

Однако, похоже, это не работает для меня.Я все еще получаю кучу времени на загрузку, и сцена сразу показывается, даже если я не вызвал код, чтобы показать это.Я также пытался делать

SceneManager.LoadAsyncScene("Scene", LoadSceneMode.Additive);

Так вот мой класс отвечает за выполнение этой работы.Я извиняюсь, если моя ошибка слишком проста, я новичок в Unity.Спасибо.

using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;

public class GameManager_StartGame : MonoBehaviour
{
    private GameManager_MasterMenu gameManagerRef;
    private AsyncOperation loadGame;

    private void OnEnable()
    {
        SetInitialReferences();
        StartCoroutine("loadMainScene");//loads scene before the game starts
        gameManagerRef.ContinueGameEvent += StartGame; //subscribing the StartGame method to an Event
    }

    private void OnDisable()
    {
       gameManagerRef.ContinueGameEvent -= StartGame;//getting the references to the game Manager
    }

    void SetInitialReferences()
    {
        gameManagerRef = GetComponent<GameManager_MasterMenu>();
    }

    IEnumerator loadMainScene()
    {
        Debug.LogWarning("ASYNC LOAD STARTED - " +
        "DO NOT EXIT PLAY MODE UNTIL SCENE LOADS... UNITY WILL CRASH");
        loadGame = SceneManager.LoadSceneAsync(1,LoadSceneMode.Single);
        loadGame.allowSceneActivation = false;//setting the allowscene to false so that it won't show it immediately
        yield return loadGame;
    }


    void StartGame()
    {
        if (GameReferences.currentSave == null)
        {
            GameReferences.currentSave = GameReferences.dBConnector.GetLastSave();
        }
        loadGame.allowSceneActivation = true; //is activated from the outside
    }
}

1 Ответ

1 голос
/ 03 апреля 2019

Из-за выполнения цикла while вы никогда не запускаете выход при загрузке. Попробуйте поместить его в цикл async while, например

IEnumerator loadScene(){
      async = SceneManager.LoadAsyncScene("Scene", LoadSceneMode.Single);
      async.allowSceneActivation = false;

      while(!async.isDone){
              progressText.text = async.progress+"";
              yield return null;
      }

}
...