AssetBundle

1: 在Unity中,能为用户存储资源的一种压缩格式的打包集合,他可以存任意一种Unity引擎可以识别的资源: 模型,音频,纹理图,动画, 开发者自定义的二进制文件;

2: 这样做的好处就是:a.我们的安装包不用做那么大,可以把很多大的资源放到服务器上面去,安装包就比较小

           b.如果有改动的话可以去更新资源,AssetBundle就是Unity提供的一种更新资源的机制
3: AssetBundle开发步骤:
  (1): 创建AssetBundle: 项目的资源打包到AssetBundle的集合里面;
  (2): 部署到web服务器, 让客户端能够从服务器下载我们的AssetBundle;
  (3): 加载AssetBundle, 加载里面的资源;
  (4): 卸载AssetBundle, 压缩包,镜像卸载;

4:AssetBundle只会打包Assets目录下的资源文件

AssetBundle创建

1: Assets窗口的资源才可以打包;
2: 创建一个AssetBundle文件,它的名字固定式小写如果有大写系统也会换成小写;
3: AssetBundle可以设置一个Varaint,就是一个后缀。可以通过后缀来设置不同分辨率的资源;
4: 将一个资源打入到AssetsBundle: 点击资源,选择对应的AssetBundle就可以了;
5: 编写代码导出AssetBundle文件:
  (1)using UnityEditor; 引入编辑器操作的名字空间;
  (2)调用Api: BuildPipeline.BuildAssetBundles(outpath, BuildAssetBundleOptions, BuildTarget); 文件夹的路径需要手动创建,否者会报错;
6: 使用buildmap来对指定的资源进行打包;
  (1)BuildPipeline.BuildAssetBundles(outpath, AssetsBoundlesBuild[], BuildAssetBundleOptions, BuildTarget);
  (2)AssetBundleBuild[] buildMap = new AssetBundleBuild[2]; //定义AssetBuild数组
    buildMap[0].assetBundleName = "resources"; //打包的资源包名称,开发者可以随便命名
    string[] resourcesAssets = new string[2]; //定义字符串,用来记录此资源包文件名称
    resourcesAssets[0] = "resources/1.prefab"; //将需要打包的资源名称赋给数组
    resourcesAssets[1] = "resources/MainO.cs";
    buildMap[0].assetNames = resourcesAssets; //将资源名称数组赋给AssetBuild
    BuildPipeline.BuildAssetBundles("Assets/AssetBundles", buildMap, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); //打包资源并导出

AssetBundle实例

1.创建Unity项目和文件目录,保存场景

2.创建一个立方体Cube节点,拖进res文件夹下,变成预制体

3.点击这个预制体cube,发现最右下角有一栏AssetBundle,点击第一个选项框,点击New,命名为cube_bundle,预制体选择这个新建的Bundle,第二个选项框是后缀,可以加也可以不加。等我们打包的时候就会把cube放进cube_bundle里面

4.现在并没有压缩资源包,需要我们用代码来打包资源到AssetBundle,第3步只是标记了这个预制体资源属于哪个包

5.代码开始,首先扩展编辑器,创建Editor文件夹,里面创建一个脚本export_assetbundle,再创建一个AssetBundles的文件夹用来作为等下压缩包的输出路径

 打开export_assetbundle脚本

using UnityEngine;
using System.Collections;
using UnityEditor;public class export_assetbundle : Editor
{[MenuItem("build/build_assetbundle")]//菜单栏上面多了build/build_assetbundle选项//点击build/build_assetbundle会调用的函数static void run(){// 调用函数来打包asset bundle;// 输出路径: "Assets/AssetBundles", 手动创建好//打包所有的AssetBundlesBuildPipeline.BuildAssetBundles("Assets/AssetBundles", BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);//参数分别为输出路径,选项(默认没要求),发布的平台// end //打包多个资源的做法,整个列表的资源/*AssetBundleBuild[] buildMap = new AssetBundleBuild[2];    //定义AssetBuild数组buildMap[0].assetBundleName = "resources";                 //打包的资源包名称,开发者可以随便命名string[] resourcesAssets = new string[2];                       //定义字符串,用来记录此资源包文件名称resourcesAssets[0] = "resources/1.prefab";                    //将需要打包的资源名称赋给数组resourcesAssets[1] = "resources/MainO.cs";buildMap[0].assetNames = resourcesAssets;                   //将资源名称数组赋给AssetBuild   BuildPipeline.BuildAssetBundles("Assets/AssetBundles", buildMap, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64)*/}
}

6.点击菜单栏上的build/build_assetbundle,发现AssetBundles文件夹里面多出了这些文件

其中cub_bundle就是AssetBundle文件,cub_bundle.mainfest是描述说明的一些文件,帮助我们管理和查看AssetBundle的相关信息,可以看出我们打包了哪些东西进去

7.部署AssetBundle到服务器,供客户端下载,Unity去下载AssetBundle使用的是web,也就是HTTP的download服务,我们需要在服务器上面部署一个webserver,这一步需要用到node.js服务器,把文件部署到服务器上

   部署服务器

  a: 创建一个webserver到自己的电脑某个目录下,进入文件夹,右键---->在此处打开命令窗口。输入命令npm install express,这个是一个基于Node的轻量级高效的wenbserver开发框架。

  b.在webserver文件夹下再创建一个www_root文件夹,用来存放我们下载的assetbundle,我们把cub_bundle拷贝到这个路径里面来,也就是将生成的AssetBundle拷贝到服务器上;

  c.在webserver文件夹下再创建一个webserver.js,里面写可以被人下载的代码

var path = require("path");
var express = require("express");
var app = express();
app.use(express.static(path.join(process.cwd(), "www_root")));
app.listen(6080); // http://127.0.0.1:6080/cub_bundle

  d.启动web服务器,就是输入命令node webserver.js

  e.打开浏览器,输入http://127.0.0.1:6080/cub_bundle网址,提示我们要下载文件,说明webserver搭建成功,服务器已经允许下载了。

  f: 以上是以服务器课程的node.js的express框架搭建的webserver为例来进行部署;

8.创建一个空节点game_scene,在这个节点下面挂载一个脚本game_scene,放在scripts文件夹下,来控制AssetBundle的下载

  AssetBundle下载

  a: 非缓冲下载: 创建一个WWW的实例来下载AssetBundle;
    (1) 使用协程下载AssetBundle,
    (2) 使用WWW的URL接口来下载;

  b: 缓冲下载:使用WWW类的LoadFromCacheOrDownload来实现下载AssetBundle, 当再次下载的时候,只有当版本低或不存在的时候才下载;web平台缓冲的大小是50M, IOS/android缓冲的大小为4GB;

  AssetBundle加载

  1: AssetBundle.LoadAsset(路径); // 资源所在的路径名字
  2: AssetBundle.LoadAllAsset()加载所有的资源

  AssetBundle卸载

  1:卸载
    AssetBoundle.Unload(false);
    AssetBoundle.Unload(true);
    true: 卸载内存镜像以及Asset的内存实例;
    false: 卸载内存镜像不卸载Asset内存实例;
  2: 不能使用WWW对象去下载一个已经被加载进来的AssetBundle;

 打开game_scene脚本

using UnityEngine;
using System.Collections;public class game_scene : MonoBehaviour {public string url;//在面板的url属性里面填http://127.0.0.1:6080/cub_bundlepublic int version; // 版本号,自己在编辑器面板设置的。每次下载到本地的时候,就把这个属性保存到本地。//下次下载的时候,比对本地的版本号和编辑器面板设置的版本号是否一致,比编辑器的小就重新下载,相等就不下载。// Use this for initializationvoid Start () {// this.StartCoroutine(this.nocache_load());//启动不缓存下载的协程this.StartCoroutine(this.cache_load());//启动缓存下载的协程
    }//下载assetbundle,不缓存在本地
    IEnumerator nocache_load() {WWW w = new WWW(this.url);yield return w;// 下载完成;Debug.Log("download end");if (w.error != null) {Debug.Log(w.error);}// 内存镜像, assetbundle, 有点像压缩包AssetBundle bundle = w.assetBundle;//bundle就是我们成功下载下来的cub_bundleDebug.Log("download success...");//成功获取// end // 使用里面的资源,可以在cub_bundle.manifest里面查看有哪些资源可以用,在Assets:目录下的就是可用资源路径Object prefab = bundle.LoadAsset("Assets/res/Cube.prefab");GameObject obj = (GameObject)Instantiate(prefab);obj.transform.parent = this.transform;//把实例化的资源文件(Cube预制体)加到当前节点下作为子节点// end // 卸载AssetBundle镜像, 卸载压缩镜像,有点像删除压缩包bundle.Unload(false); // 只会卸载assetbundle内存镜像// bundle.Unload(true); // 会卸载内存镜像,也会释放掉从这个assetbunle里面加载起来的资源,会导致最终的cube节点缺少材质之类的资源;// end
    }//下载assetbundle,缓存在本地
    IEnumerator cache_load() {WWW w = WWW.LoadFromCacheOrDownload(this.url, this.version);yield return w;// 下载完成;Debug.Log("download end");if (w.error != null) {Debug.Log(w.error);}// 内存镜像, assetbundle, 有点像压缩包AssetBundle bundle = w.assetBundle;//bundle就是我们成功下载下来的cub_bundleDebug.Log("download success...");//成功获取// end // 使用里面的资源,可以在cub_bundle.manifest里面查看有哪些资源可以用,在Assets:目录下的就是可用资源路径Object prefab = bundle.LoadAsset("Assets/res/Cube.prefab");GameObject obj = (GameObject)Instantiate(prefab);obj.transform.parent = this.transform;//把实例化的资源文件(Cube预制体)加到当前节点下作为子节点// end // 卸载AssetBundle镜像, 卸载压缩镜像,有点像删除压缩包bundle.Unload(false); // 只会卸载assetbundle内存镜像// bundle.Unload(true); // 会卸载内存镜像,也会释放掉从这个assetbunle里面加载起来的资源,会导致最终的cube节点缺少材质之类的资源;// end
    }// 下载assetbundle, nocache, cache, 缓存还是不缓存//  version版本号是用来判断要下载的版本和已经下载的版本号是否相同,不同就下载,之前没有也下载// end // Update is called once per framevoid Update () {}
}

9.运行结果

正常的

不正常的

bundle.Unload(true)的,也就是删除了加载的资源的

转载于:https://www.cnblogs.com/HangZhe/p/7275849.html

关于Unity中从服务器下载资源压缩包AssetBundle的步骤相关推荐

  1. C#使用Protocol Buffer(ProtoBuf)进行Unity中的Socket通信

    From: http://www.jb51.net/article/82795.htm 这篇文章主要介绍了C#使用Protocol Buffer(ProtoBuf)进行Unity的Socket通信的实 ...

  2. 关于unity 中使用AssetBundle加载资源,shader偶尔会丢失的问题解决办法

    问题描述: 因为项目中要进行热更新设计,所以用unity官方推荐的打包方式assetbundle进行打包,打包好了以后再电脑上运行正常,但是当发布到android上后发现偶尔场景背景会出现空白,多方查 ...

  3. 「翻译」Unity中的AssetBundle详解(一)

    AssetBundles AssetBundle是一个存档文件,其中包含平台在运行时加载的特定资产(模型,纹理,预制,音频剪辑,甚至整个场景).AssetBundles可以表示彼此之间的依赖关系;例如 ...

  4. Unity中的资源管理-AssetBundle(1)

    本文分享Unity中的资源管理-AssetBundle(1) 在上一篇文章中, 我们简单介绍了Unity中的资源和基本的使用, 今天我们详细介绍下使用AssetBundle来管理资源. AssetBu ...

  5. 【Unity3D 问题总结】☀️ | 在Unity Hub中 许可证服务器连接失败 解决方案

    Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 . 包括游戏开发.美术.建筑.汽车设计.影视在内的所有创作者,借助 Unity 将创意 ...

  6. unity从服务器下载资源并且保存到本地

    两个小功能 从服务器下载资源和资源保存到本地~ 下面代码 /// <summary>/// 下载并保存资源到本地/// </summary>/// <param name ...

  7. Unity中AB包详解(超详细,特性,打包,加载,管理器)

    Unity中的AssetBundle详解 AssetBundle的概念 AssetBundle又称AB包,是Unity提供的一种用于存储资源的资源压缩包. Unity中的AssetBundle系统是对 ...

  8. 【专栏精选】Unity中的HTTP网络通信

    本文节选自洪流学堂公众号技术专栏<大话Unity2019>,未经允许不可转载. 洪流学堂公众号回复专栏,查看更多专栏文章. 洪流学堂,让你快人几步.你好,我是郑洪智. 大智:"小 ...

  9. 【Unity3D日常开发】Unity中的资源加载与文件路径

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

最新文章

  1. RISC-V正在采取行动,避免MIPS类的碎片化
  2. python用outlook自动发邮件_Python 调用outlook发送邮件(转 )
  3. 元素(洛谷-P4570)
  4. (5)呼吸灯systemverilog与VHDL编码
  5. linux bitcoind环境搭建,bitcoin_book_2nd
  6. C++ string类常用函数
  7. Dell R730 服务器重装系统Ubuntu16.04
  8. 模板设计在tomcat中的应用
  9. 网易云音乐歌曲带时间轴歌词的提取
  10. html幻灯片滚动效果,jQuery实现全屏幻灯片的滚动页面效果
  11. 《精通Javascript+jQuery》视频教程
  12. lol登录服务器时显示乱码,lol服务器变成乱码 | 手游网游页游攻略大全
  13. 小程序AppID当前开发者未绑定此AppId,请到小程序管理后台操作后重试
  14. 服务器上连接无线路由器,手把手教你怎么设置连接两个无线路由器上网
  15. Java开发面试必问项。标识符、字面值、变量、数据类型,该学了
  16. 股票 市盈率(PE)
  17. heic是什么格式?如何转成JPG格式?
  18. OPPO、一加将在德国禁售?原来是被“专利流氓”诺基亚盯上了!
  19. 服务器启动显示按f1f2f10,电脑开机提示按f1f2f5 电脑开机要按F1F2F5
  20. GPS问题调试—MobileLog中有关GPS关键LOG的释义

热门文章

  1. 算法 msrcr_一种快速简便优秀的全局曲线调整与局部信息想结合的非线性彩色增强算法(多图深度分析和探索)...
  2. oracle 日期检查,在检查约束中使用日期,Oracle
  3. Ajax的优缺点以及异步和同步的区别
  4. Android开发应该了解的Binder原理,专题解析
  5. 【深度学习】协同优化器和结构化知识蒸馏
  6. python【蓝桥杯vip练习题库】ADV-303 数组求和
  7. 解决Python memory error的问题--扩充虚拟内存
  8. c语言课程设计走迷宫游戏,C语言课程设计-迷宫游戏.doc
  9. easyexcel写入数据为空_如何解决Redis缓存和MySQL数据一致性的问题?
  10. iconfont 图标转为字体_阿里字体库iconfont使用方法