废话不多说 直接上代码.
从服务器下载的, 很简单
private IEnumerator Start()
{
byte[] ab = null;
int len = 0;
WWW www =null;
foreach (string item in Directory.GetFiles("TestAssetBundles"))
{
www = new WWW(@"http://localhost:15109/TestAssetBundles/"+item.Split('\\')[1]);
yield return www;
if (www.isDone)
{
ab = www.bytes;
len = ab.Length;
}
// www.Dispose();
Stream str = null;
FileInfo file = new FileInfo(Application.persistentDataPath + "/"+item.Split('\\')[1]);
if (file.Exists)
{
file.Delete();
str = file.Create();
}
if (!file.Exists)
{
str = file.Create();
}
str.Write(ab, 0, len);
Debug.Log(item.Split('\\')[1]);
str.Close();
str.Dispose();
www.Dispose();
www = null;
}
www.assetBundle.Unload(true);
从下载的路径读取
string index;
private void Start()
{
index = GameObject.FindWithTag("SceneTag").name.Split('_')[1];
StartCoroutine(LoadScene());
}
public IEnumerator LoadScene()
{
UnityWebRequest request = UnityWebRequest.GetAssetBundle(@"file://" + Application.persistentDataPath + "/" + "TestAssetBundles"); // 获取主assetbundle 和打包时候生成的文件夹的名字相同
yield return request.Send(); //开始获取
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request); //得到主assetbundle的对象
AssetBundleManifest abmanifest = ab.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); //根据主assetbundle 找到主manifest 必须叫这个名
string[] dependencies = abmanifest.GetAllDependencies("uiroot" + index + ".unity3d"); //根据abm拿到参数的assetbundle的关联的assetbundle
List<AssetBundle> test = new List<AssetBundle>();
foreach (var item in dependencies) //遍历所有关联assetbundle的名字
{
UnityWebRequest requestchild = UnityWebRequest.GetAssetBundle(@"file://" + Application.persistentDataPath + "/" + item); //获取这些关联的assetbundle
yield return requestchild.Send();
AssetBundle tempAB = DownloadHandlerAssetBundle.GetContent(requestchild);//因为不需要实例关联assetbundle这些物体(这里是一些图集) 所以只需要将他们生成到项目中就可以了,不需要拿到ab实例?????????????????这是绝对不行了, 因为你没有办法在加载后卸载!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
print(tempAB);
test.Add(tempAB);
requestchild.Dispose();
requestchild = null;
}
UnityWebRequest requestRoot = UnityWebRequest.GetAssetBundle(@"file://" + Application.persistentDataPath + "/" + "uiroot" + index + ".unity3d");
yield return requestRoot.Send();
AssetBundle abRoot = DownloadHandlerAssetBundle.GetContent(requestRoot);
GameObject go = abRoot.LoadAsset<GameObject>("UI Root" + index);
foreach (AssetBundle item in test)
{
item.Unload(false);
}
//request.Dispose();
//requestRoot.Dispose();
ab.Unload(false);
abRoot.Unload(false);
Instantiate(go);
ok在上班就不解释太多了