有没有办法在异步操作执行之前更改其优先级?

时间:2019-07-05 19:32:39

标签: c# unity3d

我正在为Unity中的游戏创建一个保存/加载系统,但是遇到了问题。

保存系统当前在保存时将所有打开的场景保存到文件列表中。

加载时,即在游戏中玩家死亡时,场景都是从从文件中拉出的列表中异步加载的。

我遇到的问题是,由于始终需要统一加载至少一个场景,因此我最终获得了已加载任何场景的多个实例。到目前为止,我想出的解决方案是将所有已加载的场景放入列表中,然后在加载保存文件的场景后立即将其卸载,但问题在于:

我不知道如何确保在加载操作之后 进行卸载操作。

我搜索google的结果很少。除了unity的文档无济于事外,该文档指出异步操作具有.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 个答案:

答案 0 :(得分:1)

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();

}