在游戏加载时管理资产异步加载的最佳方式



我正在为iOS和Android开发一款手机空闲游戏,现在我正处于创建游戏的保存/加载基础设施的阶段。

当打开游戏应用加载之前保存的会话时,在应用关闭后,在加载之前保存的会话之前,我正在加载强制性的游戏资产,主要是ScriptableObjects,带有Addressables,像这样异步加载:

StartCoroutine(LoadInventoryAssets());
StartCoroutine(LoadCharacterAssets());
StartCoroutine(LoadSoundAssets());

每个LoadAssets函数大致如下:

_assetsLoadingOp = Addressables.LoadAssetsAsync<AssetType>("AssetLabel", null);
yield return _assetsLoadingOp;
if (_assetsLoadingOp.IsDone) 
{
_results = _assetsLoadingOp.Result
}

最后,当所有这些加载完成后,我运行加载相关场景、游戏对象并注入保存数据的函数。这个函数只能在之后运行所有以前的可寻址资源被加载。

yield return StartCoroutine(LoadSavedGame());

上面的问题是LoadSavedGame函数可能在之前所有的资产加载函数完成之前运行。

我可以通过将yield return添加到所有协程来解决这个问题,但这不会使每个协程依次加载而不是并行加载吗?

如果您有什么好的想法,我将不胜感激。

您可以使用一个整数来计算已经完成了多少函数。在每个LoadAssets函数的末尾:

if(++task == 3)
StartCoroutine(LoadSavedGame());

最后我采用了这种方法:

bool? inventoryAssetsLoadedResult = null, characterAssetsLoadedResult = null, soundAssetsLoadedResult = null; 
StartCoroutine(LoadInventoryAssets((result)=> inventoryAssetsLoadedResult = result));
StartCoroutine(LoadCharacterAssets((result)=> characterAssetsLoadedResult = result));
StartCoroutine(LoadSoundAssets((result)=> soundAssetsLoadedResult = result));
yield return new WaitUntil(() => inventoryAssetsLoadedResult.HasValue & characterAssetsLoadedResult.HasValue & soundAssetsLoadedResult.HasValue);

每个协程看起来像这样:

public IEnumerator LoadInventoryAssets(Action<bool> callback)
{
yield return new WaitUntil(() => _inventoryLoadingOp.IsDone);
callback(true);
}

欢迎提出任何改进建议。

相关内容

  • 没有找到相关文章

最新更新