Unity加载AssetBundle

使用版本 Unity2017.4.10 --- Vs2017 ---- Windows7

忘记加上一句,使用IIS搭建FTP的时候,别设置登录限制

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      读取路径为:

ftp://127.0.0.1:10091//StreamingAssets/PC/PC.manifest

      Tag为:prefab,image,material,依赖关系如下

总的Manifest如下:

其中,prefab.asset里面只有一个Cube,这个Cube的材质是引用image里面的一张图片

image manifest:

prefab manifest:

打包代码:

using UnityEditor;

public class BuildAssetBundle : Editor {
    [MenuItem("Build/PC")]
    public static void BuildPC()
    {
        BuildPipeline.BuildAssetBundles("Assets/StreamingAssets/PC",BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);
    }
    [MenuItem("Build/Android")]
    public static void BuildAndroid()
    {
        BuildPipeline.BuildAssetBundles("Assets/StreamingAssets/Android",BuildAssetBundleOptions.None,BuildTarget.Android);
    }
}

加载代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LoadWWW : MonoBehaviour
{

    void Start()
    {
        // 服务器地址,加载的包名(你打包到某个文件夹下,就会有一个对应的文件夹的manifest文件),版本号
        StartCoroutine(LoadManifest("ftp://127.0.0.1:10091/StreamingAssets/PC/", "PC", 1));  
    }

    /// <summary>
    /// 加载所有依赖
    /// </summary>
    /// <param name="path"></param>
    /// <param name="filename"></param>
    /// <param name="version"></param>
    /// <returns></returns>
    IEnumerator LoadManifest(string path, string filename, int version)
    {
        WWW www = new WWW(path + filename);  // 加载路径
        yield return www; // 等待加载完成
        // 如果错误不为空,这里其实应该return,但是我宁愿看见详细的报错,也不想只有一个Debug
        if (www.error != null) 
        {
            Debug.Log(www.error);
        }
        AssetBundle ab = www.assetBundle;
        AssetBundleManifest manifestName = ab.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); // 获得Manifest里面的依赖
        ab.Unload(false); // 写在相应包,注意别写True,下面会解释
        www.Dispose();
        string[] abName = manifestName.GetAllAssetBundles();  // 遍历所有AssetBundle名字
        foreach (var item in abName)
        {
            if (item == "prefab")
                StartCoroutine(LoadPrefab(path, item, version));
            else
                StartCoroutine(LoadPrefab(path, item, version,false));
        }
        yield return null;
    }

    /// <summary>
    /// 加载AssetBundle里面所有的Prefab
    /// </summary>
    /// <param name="path"></param>
    /// <param name="filename"></param>
    /// <param name="version"></param>
    /// <returns></returns>
    IEnumerator LoadPrefab(string path, string filename, int version, bool IsLoad = true)
    {
        WWW www = WWW.LoadFromCacheOrDownload(path + filename,version); // 将这个包缓存下载,下次再次加载的时候version不变,就不会重新从网络上下载
        yield return www;  // 等待下载OR加载完成
        if (www.error != null) // 如果报错信息不为空
            Debug.Log(www.error);
        AssetBundle asbundle = www.assetBundle; // 获得包
        foreach (var item in asbundle.GetAllAssetNames()) // 遍历包中的所有项
        {
            GameObject obj = asbundle.LoadAsset<GameObject>(item); // 加载
            if (IsLoad)  // 我们包里面有图片和材质,这两个不能生成实例
                Instantiate<GameObject>(obj);
        }
    }

}

       下面是对于Start里面三个参数的图片,那坨马赛克是127.0.0.1(估计你们也不信 Hah) ftp://XXX:端口//文件夹名字//文件名

之后运行,当,就会发现出现了一只Cube,去掉头营养贼高

猜你喜欢

转载自blog.csdn.net/MikuLingSSS/article/details/82838300