我正在为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));
}
答案 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();
}