我正在尝试使用 Unity Addressable 系统下载预制件。该地址位于远程服务器上,我将可寻址系统设置为从该远程服务器中提取。下面的代码从服务器加载该资产,并应该报告其下载进度。但是,这似乎不起作用。UpdateProgressBar 方法只被调用一次,然后再也不会被调用。据我所知,协程只要有事就应该运行,所以我假设使用 while 循环会导致协程继续调用 UpdateProgressBar 方法。
我在互联网上环顾四周,似乎人们在从 AsyncOperationHandles 获取下载进度方面也遇到了类似的问题,但这些问题中的大多数都是几年前的问题,所以我认为它们现在已经修复了。
无论如何,我有什么遗漏/做错了吗?我对 Unity Addressables 还很陌生,因此欢迎任何提示或建设性批评。
public IEnumerator DownloadAsset(string assetKey)
{
loadingScreen.SetActive(true);
AsyncOperationHandle<GameObject> handle = Addressables.LoadAssetAsync<GameObject>(assetKey);
handle.Completed += (AyncOperationHandle) =>
{
DownloadComplete(handle);
loadingScreen.SetActive(false);
};
yield return handle;
DownloadStatus downloadStatus = handle.GetDownloadStatus();
while (!handle.IsDone && downloadStatus.Percent < 1)
{
UpdateProgressBar(downloadStatus.Percent);
yield return null;
}
}
private void DownloadComplete(AsyncOperationHandle goHandle)
{
Debug.Log("Asset Downloaded!");
GameObject obj = goHandle.Result as GameObject;
Instantiate(obj);
Addressables.Release(goHandle);
}
public void UpdateProgressBar(float progress)
{
progressBar.normalizedValue = progress;
Debug.Log(string.Format("Downloaded {0:P1}", progress));
if (progress >= 1.0f) loadingScreen.SetActive(false);
}
单击按钮时,正在从另一个脚本调用 DowloadAsset 函数:
[SerializeField] private string assetKey;
void Start()
{
Button button = GetComponent<Button>();
button.onClick.AddListener(() => StartCoroutine(gameManager.DownloadAsset(assetKey)));
}