Есть ли способ изменить приоритет асинхронной операции перед ее выполнением? - PullRequest
2 голосов
/ 05 июля 2019

Я создаю систему сохранения / загрузки для игры в Unity, и у меня возникла проблема.

система сохранения в настоящий момент сохраняет все открытые сцены в списке файлов при сохранении.

При загрузке, т.е. после смерти игрока в игре, все сцены загружаются асинхронно из списка, извлекаемого из файла.

Проблема, с которой я сталкиваюсь, заключается в том, что из-за единства, необходимого для загрузки хотя бы одной сцены в любое время, я получаю несколько экземпляров тех сцен, которые уже были загружены. Решение, которое я нашел до сих пор, состоит в том, чтобы поместить все загруженные сцены в список, а затем выгрузить их сразу после загрузки сцен в файле сохранения, но в этом заключается проблема:

Я понятия не имею, как обеспечить выполнение операций выгрузки после операций загрузки.

Я искал в Google только, чтобы найти очень мало результатов по этому вопросу; кроме довольно бесполезной документации единицы, в которой говорится, что асинхронные операции имеют свойство .priority, но не приводятся примеры того, как изменить его до того, как асинхронный запуск фактически начнет выполняться, только то, что приоритет не действует после его запуска.

https://docs.unity3d.com/ScriptReference/AsyncOperation-priority.html

вот уменьшенная и прокомментированная версия моего кода:


List<AsyncOperation> _asyncs = new list<AsyncOperation>();
List<String> _scenesFromLoadedSaveFile = new List<string>();

//pretend there is something here which gets all the loaded scenes 
//and puts them in _listOfAlreadyLoadedScenes. I have that in my real code.

foreach(string _sceneToUnload in _listOfAlreadyLoadedScenes)
{
    //this is where i need help.
    //how do i set the priority of this before it runs here?
    _asyncs.add(SceneManager.UnloadSceneAsync(_sceneToUnload)); 
}

foreach(string _sceneToLoad in _scenesFromLoadedSaveFile)
{
    _asyncs.add(Scenemanager.LoadSceneAsync(_sceneToLoad));
}

1 Ответ

1 голос
/ 06 июля 2019

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

Таким образом, вместо этого может быть лучше установить жесткую последовательность выполнения всей загрузки и ожидания ее завершения до начала разгрузки:

List<AsyncOperation> _asyncs = new list<AsyncOperation>();
List<String> _scenesFromLoadedSaveFile = new List<string>();

IEnumerator DoSceneReload() 
{
    // set _listOfAlreadyLoadedScenes here

    _asyncs.Clear();

    foreach(string _sceneToLoad in _scenesFromLoadedSaveFile)
    {
        _asyncs.add(Scenemanager.LoadSceneAsync(_sceneToLoad));
    }

    // wait for every scene to load
    foreach(AsyncOperation ao in _asyncs)
    {
        yield return ao; 
    }

    _asyncs.Clear();


    // unload every scene asynchronously 
    foreach(string _sceneToUnload in _listOfAlreadyLoadedScenes)
    {
        _asyncs.add(SceneManager.UnloadSceneAsync(_sceneToUnload)); 
    }

    MethodToCallOnAllUnloadsBeginning();

    // If you want to, you could then wait for every scene to load 
    // before performing some final task
    foreach(AsyncOperation ao in _asyncs)
    {
        yield return ao; 
    }

    MethodToCallOnAllUnloadsComplete();

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...