我把AssetBundless整个文件的资源都放在了我的web服务器上,里面除了有AssetBundless自身的4个文件之外,还有player和plane各4个文件。[将本地打包好的AssetBundle 文件上传至web 服务器,然后本地从web 服务器端下载所有的AssetBundle 文件。从服务器端下载AssetBundle 文件,我们需要这些文件的web 路径地址,每一个地址对应一个AssetBundle 文件。 我们不可能在代码中写几十上百个文件的web 地址,所以说我们需先下载“目录”的AssetBundle 文件,在这里也就是AssetBundless.manfiest,然后通过它里面的AssetBundle 名称再来间接的获取其他的AssetBundle 文件的下载路径地址。 代码如下:
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
//引入UnityEngine.Networking用来执行网络操作
public class load : MonoBehaviour
{
//根目录的文件夹产生的AssetBundless文件地址
private string rootAssetBundle = @”http://www.wjgbaby.com/unityModel/AssetBundless/AssetBundless";
//根目录地址
private string assetBundleRoot = @”http://www.wjgbaby.com/unityModel/AssetBundless/";
void Start ()
{
//开启协程
StartCoroutine("DownloadAssetBundless");
}
/// <summary>
/// 下载根目录AssetBundle文件
/// </summary>
/// <returns></returns>
IEnumerator DownloadAssetBundless()
{
//创建一个获取AssetBundle 文件的web 请求.
UnityWebRequest request = UnityWebRequest.GetAssetBundle(rootAssetBundle);
//发送web请求
yield return request.SendWebRequest();
//从web获取内容,返回一个AssetBundle类型的数据
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
//获取AssetBundless.manifest的manifest文件
AssetBundleManifest manifest = ab.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
//获取AssetBundless.manifest文件中的所有AssetBundle的名称信息
string\[\] assets= manifest.GetAllAssetBundles();
for (int i = 0; i <assets.Length;i++)
{
Debug.Log(assetBundleRoot+assets\[i\]);
//开启协程
StartCoroutine(DownLoadSingleAssetBundel(assetBundleRoot + assets\[i\]));
}
}
/// <summary>
/// 下载模型单个的AssetBundle文件
/// </summary>
/// <returns></returns>
IEnumerator DownLoadSingleAssetBundel(string str)
{
UnityWebRequest request = UnityWebRequest.GetAssetBundle(str);
yield return request.SendWebRequest();
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
//通过获取AssetBundle对象获取内部所有资源的名称,返回在一个数组
string\[\] names= ab.GetAllAssetNames();
//遍历数组,服务端下载所有文件
for (int i= 0;i< names.Length;i++)
{
//截取路径地址中的文件名,且无后缀名. 需要引入System.IO 命名空间.
string shortName = Path.GetFileNameWithoutExtension(names\[i\]);
GameObject go = ab.LoadAsset<GameObject>(shortName);
GameObject.Instantiate<GameObject>(go, Vector3.zero, Quaternion.identity);
}
}
}
结果如下,两个物体都是从web服务器加载过来的。[