Unity-资源打包-AssetBundle

AB包定义作用

1.压缩大小
2.热更新使用

使用流程

对要打包的资源进行设置


AB.PNG

C#脚本不能打成AB包,因为C#在Unity中会编译成中间文件。

参数相关

Build的路径(随意只要是在硬盘上都可以的)
BuildAssetBundleOptions
BuildAssetBundleOptions.None:使用LZMA算法压缩,压缩的包更小,但是加载时间更长。使用
之前需要整体解压。一旦被解压,这个包会使用LZ4重新压缩。使用资源的时候不需要整体解压。
在下载的时候可以使用LZMA算法,一旦它被下载了之后,它会使用LZ4算法保存到本地上。
BuildAssetBundleOptions.UncompressedAssetBundle:不压缩,包大,加载快
BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4压缩,压缩率没有LZMA高,但是
我们可以加载指定资源而不用解压全部注意使用LZ4压缩,可以获得可以跟不压缩相媲美的加载速度,而且比不压缩文件要小。
BuildTarget选择build出来的AB包要使用的平台

创建AB包
创建AB包,使用BuildPipeline类中的方法

    private static readonly string AbPath = Application.streamingAssetsPath;
    [MenuItem("Tools/CreateAB")]
    static void CreateAbPack()
    {
        BuildPipeline.BuildAssetBundles(AbPath, BuildAssetBundleOptions.UncompressedAssetBundle, BuildTarget.Android);
        AssetDatabase.Refresh();
    }

清除文件中的AB包

[MenuItem("Tools/ClearABFile")]
    static void ClearAbPack()
    {
        DirectoryInfo directoryInfo = new DirectoryInfo(AbPath);
        FileSystemInfo[] fileSystemInfo = directoryInfo.GetFileSystemInfos();
        foreach (FileSystemInfo item in fileSystemInfo)
        {
            if(item is DirectoryInfo)
            {
                DirectoryInfo d = new DirectoryInfo(item.FullName);
                d.Delete(true);
            }
            else
            {
                item.Delete();
            }
        }
        AssetDatabase.Refresh();
    }

读取AB包
1.直接记载一个单独的物体(无依赖)
通过AssetBundle的LoadFromFile方法获取AB包,在通过LoadAsset的泛型方法获得GameObject

    private string path;
    void Start () {
        path = Application.streamingAssetsPath;
        AssetBundle ab = AssetBundle.LoadFromFile(path + "/prefab");
        //print(ab);
        GameObject go = ab.LoadAsset<GameObject>("Sphere");
        Instantiate(go);
    }

2.通过依赖加载,从本地进行加载

            path = Application.streamingAssetsPath;
            //从文件中加载StreamingAssets文件
            AssetBundle assetBundle = AssetBundle.LoadFromFile(path + "/StreamingAssets");
            //从StreamingAssets文件中获得AssetBundleManifest对象
            AssetBundleManifest assetBundleManifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
            //从AssetBundleManifest中加载一个AssetBundle对象的全部依赖
            string[] dps = assetBundleManifest.GetAllDependencies("prefab");
            //遍历依赖,加载所有的依赖
            for (int i = 0; i < dps.Length; i++)
            {
                AssetBundle ab1 = AssetBundle.LoadFromFile(path + "/" + dps[i]);
            }
            AssetBundle ab = AssetBundle.LoadFromFile(path + "/prefab");
            GameObject go = ab.LoadAsset<GameObject>("Sphere");
            Instantiate(go);

3.异步加载从文件中

if (GUILayout.Button("异步加载"))
        {
            StartCoroutine(LoadAB(AbLoadBP));
        }
IEnumerator LoadAB(Action action)
    {
        path = Application.streamingAssetsPath;
        AssetBundleCreateRequest assetBundle = AssetBundle.LoadFromFileAsync(path + "/prefab");
        yield return assetBundle;
        action();
    }

4.从内存中加载
异步:

    IEnumerator LoadFromMemoryAsync()
    {
        string path = Application.streamingAssetsPath + "/" + "prefab";
        //byte by = byte.Parse(path);
        AssetBundleCreateRequest createRequest = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
        yield return createRequest;
        AssetBundle bundle = createRequest.assetBundle;

        GameObject prefab = bundle.LoadAsset<GameObject>("Cube");
        Instantiate(prefab);
    }

同步:

private void LoadFromMemory()
    {
        string path = Application.streamingAssetsPath + "/" + "prefab";
        AssetBundle bundle = AssetBundle.LoadFromMemory(File.ReadAllBytes(path));
        GameObject prefab = bundle.LoadAsset<GameObject>("Cube");
        Instantiate(prefab);
    }

5.从本地获得网络加载WWW.LoadFromCacheOrDownload
通过URL进行加载

IEnumerator LoadFromCacheOrDownLoadExample ()
    {
        while (!Caching.ready)
        {
            yield return null;
        }
        var www = WWW.LoadFromCacheOrDownload("http://192.168.0.250/prefab.unity3d", 5);
        //var www = WWW.LoadFromCacheOrDownload(@"D:\the9git\the9_09\UnityProject\UnityBase04\Assets\StreamingAssets\prefab", 5);
        yield return www;
        if (!string.IsNullOrEmpty(www.error))
        {
            Debug.Log(www.error);
            yield return null;
        }
        AssetBundle myLoadedAB = www.assetBundle;
        GameObject prefab = myLoadedAB.LoadAsset<GameObject>("Cube");
        Instantiate(prefab);
        //var asset = myLoadedAB.mainAsset;
    }

6.通过UnityWebRequest加载AB包

    IEnumerator InstantiateObject()
    {
        //string uri = "file:///" + Application.streamingAssetsPath + "/prefab";
        string uri = "http://192.168.0.250/StreamingAssets/perfab.unity3d";
        using (UnityWebRequest webRequest = UnityWebRequest.GetAssetBundle(uri))
        {
            yield return webRequest.SendWebRequest();
            AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(webRequest);
            GameObject cube = bundle.LoadAsset<GameObject>("Cube");
            Instantiate(cube);
        }
        string uri2 = "http://192.168.0.250/StreamingAssets/StreamingAssets";
        using (UnityWebRequest webRequest2 = UnityWebRequest.GetAssetBundle(uri2))
        {
            yield return webRequest2.SendWebRequest();
            AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(webRequest2);
            AssetBundleManifest assetBundleManifes = bundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
            string[] dps = assetBundleManifes.GetAllDependencies("perfab.unity3d");
            for (int i = 0; i < dps.Length; i++)
            {
                string uri3 = "http://192.168.0.250/StreamingAssets/" + dps[i];
                using (UnityWebRequest webRequest3 = UnityWebRequest.GetAssetBundle(uri3))
                {
                    yield return webRequest3.SendWebRequest();
                    AssetBundle ab = DownloadHandlerAssetBundle.GetContent(webRequest3);
                }
            }
        }
    }

卸载有两个方面
1,减少内存使用
2,有可能导致丢失
所以什么时候去卸载资源
AssetBundle.Unload(true)将使全部InstanceID对应的GUID和localID无效,即使有资源被使用着,所有资源将显示为Missing。
(1,在关切切换、场景切换2,资源没被用的时候 调用)
AssetBundle.Unload(false)卸载所有没用被使用的资源
个别资源怎么卸载1,通过 Resources.UnloadUnusedAssets. 2,场景切换的时候
AssetBundle卸载

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容