0

我正在尝试使用 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)));
    }
4

0 回答 0