gpt4 book ai didi

c# - 有没有办法在执行之前更改异步操作的优先级?

转载 作者:太空宇宙 更新时间:2023-11-03 12:01:11 25 4
gpt4 key购买 nike

我在 Unity 中为游戏创建保存/加载系统时遇到了问题。

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

加载时,即玩家在游戏中死亡时,所有场景都从从文件中提取的列表中异步加载。

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

我不知道如何确保卸载操作发生在加载操作之后

我用谷歌搜索只找到很少的结果;除了声明异步操作具有 .priority 属性的 unity 相当无用的文档外,但没有举例说明如何在异步开始实际运行之前更改它,只是优先级在它之后没有影响开始。

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

最佳答案

很可能 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();

}

关于c# - 有没有办法在执行之前更改异步操作的优先级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56908403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com