Unity 使用携程WebRequest下载GetAssetBundle加载 不继承MonoBehaviour 提示下载进度可以在外面的类调用下载进度,并且中断下载重新下载
时间: 2024-02-18 17:02:41 浏览: 166
可以使用Unity的Coroutine来实现异步下载和加载AssetBundle,不需要继承MonoBehaviour。
首先,你需要在外部类中定义一个IEnumerator类型的方法来下载AssetBundle,这个方法可以在协程中被调用。在这个方法中,你可以使用Unity的WebRequest类进行下载,然后使用AssetBundle.LoadFromMemoryAsync方法异步加载AssetBundle。同时,在下载和加载的过程中,你可以使用Unity的yield return语句来暂停协程并等待操作完成。
在下载过程中,你可以在外部类中定义一个下载进度的回调函数,然后在下载过程中不断调用该回调函数来更新下载进度。
如果需要中断下载并重新下载,可以在外部类中定义一个bool类型的变量来控制下载状态。在下载过程中,当需要中断下载时,将该变量设置为true,然后在下一次循环中检查该变量并退出下载循环。
以下是一个简单的示例代码:
```csharp
public class AssetBundleDownloader {
private string bundleUrl;
private Action<float> progressCallback;
private bool isDownloading;
public AssetBundleDownloader(string url, Action<float> progressCallback) {
this.bundleUrl = url;
this.progressCallback = progressCallback;
this.isDownloading = false;
}
public IEnumerator DownloadAssetBundle() {
isDownloading = true;
using (UnityWebRequest request = UnityWebRequest.Get(bundleUrl)) {
request.SendWebRequest();
while (!request.isDone && isDownloading) {
float progress = request.downloadProgress;
progressCallback?.Invoke(progress);
yield return null;
}
if (request.isNetworkError || request.isHttpError) {
Debug.LogError(request.error);
} else {
byte[] data = request.downloadHandler.data;
AssetBundleCreateRequest bundleRequest = AssetBundle.LoadFromMemoryAsync(data);
while (!bundleRequest.isDone) {
float progress = bundleRequest.progress;
progressCallback?.Invoke(progress);
yield return null;
}
AssetBundle bundle = bundleRequest.assetBundle;
// do something with the loaded AssetBundle
}
}
}
public void StopDownload() {
isDownloading = false;
}
}
```
在外部类中,你可以使用以下方法来调用该下载器,并在下载过程中更新进度:
```csharp
private AssetBundleDownloader downloader;
private void StartDownload() {
downloader = new AssetBundleDownloader(bundleUrl, OnDownloadProgress);
StartCoroutine(downloader.DownloadAssetBundle());
}
private void OnDownloadProgress(float progress) {
// update progress UI
}
private void StopDownload() {
downloader?.StopDownload();
}
```
阅读全文