因为WWW过时了,我也不知道是何时的事。。。所以我们全部用的UnityWebRequest,很少用所以感觉很别扭。
关键都在注释中了,自己结合网上看的写的一套,只是个案例,测试之用,创建一个StreamingAssets文件夹,把脚本挂到任意物体上即可使用。
using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
public class DownloadAssetBundle : MonoBehaviour
{
//下载地址:这里就是老师的一个网站服务器,你可以访问下面的地址
private string mainUrl = @"http://www.mkcode.net/mkdemo/AssetBundles/AssetBundles"; //文件名就叫AssetBundles(就是一个"目录",存所有打包资源)
private string rootUrl = @"http://www.mkcode.net/mkdemo/AssetBundles/"; //AssetBundle的根目录
// Start is called before the first frame update
void Start()
{
StartCoroutine(DownloadMainAssetBundle());
}
/// <summary>
/// 下载"目录"文件
/// </summary>
IEnumerator DownloadMainAssetBundle()
{
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(mainUrl);
yield return request.SendWebRequest();
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
//通过目录assetbundle获取manifest文件得到所有AssetBundle资源文件名称
AssetBundleManifest manifest = ab.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
string[] assets = manifest.GetAllAssetBundles();
//进而下载每个资源
for (int i = 0; i < assets.Length; i++)
{
StartCoroutine(DownloadSingleAsset(rootUrl + assets[i]));
//保存到本地(为什么再下载一遍看下面的summary)
StartCoroutine(MyUnityWebRequest(rootUrl + assets[i], Path.GetFileName(rootUrl + assets[i])));
}
}
/// <summary>
/// 下载单个资源
/// </summary>
IEnumerator DownloadSingleAsset(string url)
{
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
yield return request.SendWebRequest();
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
//获取所有资源名称
string[] names = ab.GetAllAssetNames(); // -> 妈的其实是路径
for (int i = 0; i < names.Length; i++)
{
//实例化资源
string nameWithoutExtension = Path.GetFileNameWithoutExtension(names[i]);
Instantiate(ab.LoadAsset<GameObject>(nameWithoutExtension));
}
}
//Summary:这老师有东西,真的体会到了整个流程,真舒服,
//但是你也会发现从服务器加载很慢,所以我们不能每次都从服务器下载,我们需要缓存到本地:
//***
//要获取到服务器上下载回来的数据,需要用到UnityWebRequest.Get(string uri) 这个API去下载,只有使用这个API下载回来的资源我们才是可以访问到数据的,
///官方专门用于下载AB包的API UnityWebRequestAssetBundle.GetAssetBundle(string uri)使用这个API下载回来的资源它是不支持原始数据访问的
//***
IEnumerator MyUnityWebRequest(string url, string assetName)
{
UnityWebRequest request = UnityWebRequest.Get(url);//要使用这种方式获取资源,才能访问到他的字节流
yield return request.SendWebRequest();
//保存下载回来的文件
if (request.isDone)
{
//构造文件流
FileStream fs = File.Create(Application.streamingAssetsPath + "/" + assetName);
//将字节流写入文件里,request.downloadHandler.data可以获取到下载资源的字节流
fs.Write(request.downloadHandler.data, 0, request.downloadHandler.data.Length);
fs.Flush(); //文件写入存储到硬盘
fs.Close(); //关闭文件流对象
fs.Dispose(); //销毁文件对象
}
}
}