我正在为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);
}
欢迎提出任何改进建议。