AssetBundle

AssetBundle的作用

AssetBundle是一个压缩包包含模型,贴图,预制体,声音,甚至整个场景可以在游戏运行时加载 AssetBundle自身保存着互相的依赖关系

压缩包可以使用LZMA和LZ4压缩算法,减少包的大小更快进行网络传输

可以把一些下载或暂时用不到的资源放在AssetBundle里减少游戏安装包大小

什么是AssetBundle

1,它是一个存在于硬盘上的文件。可以称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。这些文件可以分为两类:serialized file 和 resource files。(序列化文件和源文件)

serialized file:资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个)

resource files:某些二进制资源(图片、声音)被单独保存,方便快速加载

2,它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包加载出来的对象。这个对象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用。

//在打包时可以把不同类型的包放到不同的子文件夹里只需要在包的名字前面在加一个文件夹的名字就可以了后缀起什么都无所谓

在打包时有可能两个包同时依赖一个资源那么打包时两个包都会把这个资源的打包进自己包里这样会造成包很大

可以将需要共享的资源(也就是被很多其他包依赖的包)也单独打成一个包

这样的话打包物体时他就不会打包被依赖的资源因为被依赖的资源已经打包成一个单独的包了

但要注意加载时要先加载被依赖的资源

不然会出现贴图丢失啊什么的

加载AssetBundle的四种方式

1,AssetBundle.LoadFromMemoryAsync

2,AssetBundle.LoadFromFile

3,WWW.LoadFromCacheOrDownload//快被弃用

4,UnityWebRequest

在打包一个包时会有一个.manifest的文件里面有两个重要的属性

CRC文件校验码用于校验文件是否完整

Dependencies依赖关系:依赖那个文件(资源)

在打包的时候会有一个和打包路径文件夹名字一样的后缀为.manifest的文件

该文件存储着所有的AssetBudle的包和他们的依赖关系

可以先把该文件Load进来使用上面四种API那个都可以Load

但是不能带后缀名LoadAssetBundle包必须带后缀

load进来把其转成AssetBundle然后

可以使用AssetBundle类的实例方法LaodAsset<AssetBundleManifest>()把文件获取参数是字符串

是文件名加Manifest返回值AssetBundleManifest类型

通过GetAllAssetBundles()可以获得所有的AssetBundle包的名字返回值string[]

通过GetDirectDependencies()参数是一个AssetBundle的名字带后缀是打包时起的AssetBundle名字返回值string[]就可以获取该包所有依赖的资源

然后就可以把这些依赖资源先Load进来了

在打包时对包进行分组根据实际需求


//加载依赖资源 AssetBundle ab = AssetBundle.LoadFromFile("AssetBundle/cube/wall.unity3d");

 GameObject go = ab.LoadAsset("TwoCube"); 

 AssetBundle bundle = AssetBundle.LoadFromFile("AssetBundle/AssetBundle"); AssetBundleManifest manifest = bundle.LoadAsset("AssetBundleManifest");

        foreach (string item in manifest.GetAllAssetBundles())

        {

            Debug.Log(item);

        }

        string[] name = manifest.GetDirectDependencies("cube/wall.unity3d");

        Debug.Log(name[0]);

        AssetBundle.LoadFromFile("AssetBundle/" + name[0]);

        Instantiate(go);







//打包所有Assetbundle

        //参数

        //1,打包路径

        //2,压缩算法

        //3,打包平台

        BuildPipeline.BuildAssetBundles(OutPath,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);

加载文件

            第一种加载AssetBundle的方式(本地同步加载)

            从本地加载路径加上后缀

            AssetBundle  asset = AssetBundle.LoadFromFile("AssetBundle/cube.unity3d");

            从AssetBundle里获取物体参数被打包成AssetBundle的名字

            GameObject go = asset.LoadAsset("Cube") as GameObject;

            Instantiate(go);

            异步加载______________________________________________________________________

            AssetBundleCreateRequest  d = AssetBundle.LoadFromFileAsync("AssetBundle/cube.unity3d");

            AssetBundle dd = d.assetBundle;

            GameObject go = dd.LoadAsset("Cube") as GameObject;

            Instantiate(go);

            从内存里同步加载

            AssetBundle d = AssetBundle.LoadFromMemory(File.ReadAllBytes("AssetBundle/cube.unity3d"));

            GameObject go = d.LoadAsset("Cube") as GameObject;

            从内存异步加载也可以放在协同程序里面

            //Instantiate(go);AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes("AssetBundle/cube.unity3d"));

            AssetBundle a = request.assetBundle;

            GameObject go = a.LoadAsset("Cube") as GameObject;

            Instantiate(go);

//使用www进行网络加载

//参数是IP地址/文件

WWW wWW = WWW.LoadFromCacheOrDownload("http://192.0.0.1/cube.unity3d",1);

//等待下载完成

        yield return wWW;

//获取AssetBundle

        AssetBundle ab = wWW.assetBundle;

//从AssetBundle里加载物体

        GameObject go = ab.LoadAsset("Cube")as GameObject;

        Instantiate(go);

//使用unity自带的UnityWebRequst下载AssetBundle

IEnumerator WebLaod() {

        UnityWebRequest request =  UnityWebRequest.GetAssetBundle("http://192.0.0.1/cube.unity3d");

        yield return request.Send();

        AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);

        GameObject go = ab.LoadAsset("Cube") as GameObject;

        Instantiate(go);

    }

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

推荐阅读更多精彩内容