Unity3D AssetBundle打包与加载

转载:Unity AssetBundle 从入门到掌握(适合初学者)

简单AssetBundle打包与加载问题总结

Unity3d的AssetBundle打包——AssetBundle Browser(简单实现资源复用)

一、什么是AssetBundle?

官网给出的解释:

1、AssetBundle 是一个存档文件,包含可在运行时由 Unity 加载特定于平台的非代码资源(比如模型、纹理、预制件、音频剪辑甚至整个场景)。

2、AssetBundle 可以表示彼此之间的依赖关系。例如,一个 AssetBundle 中的材质可以引用另一个 AssetBundle 中的纹理。为了提高通过网络传输的效率,可以根据用例要求(LZMA 和 LZ4)选用内置算法选择来压缩 AssetBundle。

3、AssetBundle 可用于可下载内容(DLC),减小初始安装大小,加载针对最终用户平台优化的资源,以及减轻运行时内存压力

通俗的讲,就是把资源压缩起来,在游戏运行的过程中动态的加载、下载以及卸载掉资源,这样也缩小了安装包的大小,减轻了内存的压力。

二、AssetBundle 中有什么?

“AssetBundle”可以指两种不同但相关的东西。

1、首先是磁盘上的实际文件。这称为 AssetBundle 存档。AssetBundle 存档是一个容器,就像文件夹一样,可以在其中包含其他文件。这些附加的文件包含两种类型:

(1)一个序列化文件(Serialized File ):其中包含分解为各个对象并写入此单个文件的资源。

(2)资源文件(Resource Files):这是为某些资源(纹理和音频)单独存储的二进制数据块,允许 Unity 高效地在另一个线程上从磁盘加载它们。

2、“AssetBundle”也可以指代通过代码进行交互以便从特定 AssetBundle 存档加载资源的实际 AssetBundle 对象。该对象包含您添加到此存档文件的资源的所有文件路径的映射。

也就是说,我们可以用代码从一个特定的压缩包中加载出一个对象,这个对象包含我们一开始添加到该压缩包中的所有内容。

三、设置要打包资源的AssetBundle属性

1、我们先新建一个Cube,给它挂载一个检测脚本,把它拖到Project资源列表下形成预制体(如下图)。

/

2、在该预制体面板下,可以看到有AssetBundle的标签,单击会看到相应的标签,没有的话我们可以点击“New”新建一个。Remove UnUsed name 是移除没有使用的属性名。

标签名的命名规则:全为小写字母,加不加后缀都可;

有三种写法:

(1)cube

(2)cube.unity3d

(3)cube.assetbundle

3、测试的代码Cube如下:

using UnityEngine;public class Cube : MonoBehaviour {private bool mouseIn;private GUIStyle style = new GUIStyle();private void OnMouseEnter(){mouseIn = true;}private void OnMouseExit(){mouseIn = false;}private void OnGUI(){if (mouseIn){style.fontSize = 30;style.normal.textColor = Color.red;style.alignment = TextAnchor.MiddleCenter;GUI.Label(new Rect(Camera.main.WorldToScreenPoint(transform.position).x, Camera.main.WorldToScreenPoint(transform.position).y + 50, 100, 50), "This is a Cube!", style);}}
}

四、打包AssetBundle

接下来,试着将上面的Cube预制体打包。打包的代码如下:(该脚本要放在Project下的Editor文件夹中)

#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;public class BuildEditor : MonoBehaviour
{/// <summary>/// 编辑器扩展,该脚本需要放到Editor文件夹下/// 需要注意的:放在Editor文件夹下的脚本在打包时不会被发布出去(也就是不会被打包出去)/// </summary>[MenuItem("Bulid/Bulid AssetBundles")]//unity的编辑器扩展,使用的时候需要引入命名空间using UnityEditor//当点击Bulid AssetBundles的时候,会执行下面的方法static void BulidAllAssetBundles(){//打包AssetBundles的方法//unity5里面的BuildPipeline方法//测试本地加载 方法 StreamingAssets的路径下//宏定义 选择发布平台:这样写可以在发布不同平台的时候不需要修改代码
#if UNITY_ANDROID//安卓平台BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath,BuildAssetBundleOptions.UncompressedAssetBundle,BuildTarget.Android);
#elif UNITY_IPHONE//iOS平台BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath,BuildAssetBundleOptions.UncompressedAssetBundle,BuildTarget.IOS);
#elif UNITY_STANDALONE_WIN || UNITY_EDITORBuildPipeline.BuildAssetBundles(Application.streamingAssetsPath,//打包后文件的存放路径BuildAssetBundleOptions.UncompressedAssetBundle,//是否压缩BuildTarget.StandaloneWindows);//标准window平台,AssetBundles资源在不同平台下不共享
#endif}
}

完成后,Unity的导航栏会出现AssetBundleTools。

先建一个StreamingAssets文件夹,再点击Bulid AssetBundles,就可以打包了。打包完后,有如下文件(后面再打包,不会再生成后面两个StreamingAssets文件):

并且可以把Cube跟预制体Cube删掉,不过要记得标签名跟预制体名,后面加载的时候需要用到。

五、AssetBundle资源的加载

AssetBundle加载方式:

  1. AssetBundle.LoadFromFile 从本地加载
  2. AssetBundle.LoadFromMemory 从内存加载
  3. WWW.LoadFromCacheOrDownload 下载后放在缓存中备用(该方法逐渐被弃用)
  4. UnityWebRequest 从服务器下载

从AssetBundle中加载资源:

  1. AssetBundle.LoadAsset(assetName)
  2. AssetBundle.LoadAllAssets() 加载AB包中所有的对象,不包含依赖的包
  3. AssetBundle.LoadAssetAsync() 异步加载,加载较大资源的时候
  4. AssetBundle.LoadAllAssetsAsync() 异步加载全部资源
  5. AssetBundle.LoadAssetWithSubAssets 加载资源及其子资源

以下这张表是当使用不同的压缩方式和不同的加载方法时,内存和性能的开销情况比较:

​​​​​​​

打包完,我们试着加载一下刚打包过的资源。

新建一个C#脚本,命名为Load,进行代码的编写,编写完,把它挂在场景的一个物体上,填好对应的名称即可。

using System.Collections;
using UnityEngine;public class Load : MonoBehaviour {//这个路径是打包的路径,(简单的说就是你的AssetBundle包的路径)private string pathUrl;[Header("标签名:")]public string assetBundle;[Header("预制体名:")]public string prefabName;private void Start(){//pathUrl = “file://” + Application.dataPath + “/StreamingAssets/”;pathUrl =#if UNITY_ANDROID"jar:file://"+Application.dataPath+"!/assets/";
#elif UNITY_IPHONEApplication.dataPath+"/Raw/";
#elif UNITY_STANDALONE_WIN||UNITY_EDITOR"file://" + Application.dataPath + "/StreamingAssets/";
#endif}void OnGUI(){if (GUI.Button(new Rect (100,100,100,50), "LoadAsset")){StartCoroutine(LoadAsset());}}/// <summary>/// 加载assetBundle文件/// </summary>/// <returns></returns>private IEnumerator LoadAsset(){string mUrl = pathUrl + assetBundle;Debug.Log(mUrl);WWW www = new WWW(mUrl);Debug.Log(www.url);//等待www加载完成yield return www;if (!string.IsNullOrEmpty(www.error)){Debug.LogError(www.error);}else{//加载资源Object obj = www.assetBundle.LoadAsset(prefabName);//返回实例化对象yield return Instantiate(obj);//false:卸载用过的,true卸载全部www.assetBundle.Unload(false);}//非托管资源:GC处理不了的,一些流文件都会继承IDisposable接口www.Dispose();//释放资源}
}

最终效果:

六、AssetBundle的卸载

  1. 减少内存的使用
  2. 有可能导致丢失
  3. 在切换场景,或者确定不使用的时候卸载
    AssetBundle.Unload(true) //卸载AssetBundle文件的内存镜像,且包含所有Load创建出来的对象
    AssetBundle.Unload(false) //卸载AssetBundle文件的内存镜像,但是除了Load创建出来的对象
    Reources.UnloadAsset(Object) //释放已加载的资源Object
    Resources.UnloadUnusedAssets //卸载所有没有被场景引用的资源对象

Unity3D AssetBundle打包与加载相关推荐

  1. Unity2017 Assetbundle 打包、加载

    打包(脚本放到Editor文件夹下): [MenuItem("Framework/Build iPhone Resource", false, 100)]public static ...

  2. combotree 可以异步加载吗_Unity AssetBundle 资源打包,加载,本地缓存方式,安卓,PC本地加载路径问题...

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

  3. python环境的打包与加载

    目录 1 pip方式 1.1 requirements.txt文件的生成 1.2 requirements.txt环境的加载: 2 conda方式 2.1 env.yml文件的生成 2.2 env.y ...

  4. UE4大场景解决方案 ——Pak的打包与加载

    一.实现步骤 1.cook Content烘焙uasset文件 2.UnrealPak打包Pak文件 3.FPakFile.FPakPlatformFile从Pak文件中遍历文件StaticLoadO ...

  5. Unity5.X打包与加载AssetBundle简单示例

    准备与打包AssetBundle: 在Editor内,点击任意prefab或资源文件,在右下角(默认Editor布局)AssetsBundle处可设置此prefab的Assetsbundle属性. 例 ...

  6. unity3d 怎么生成网页版_Unity3D 基础教程3D网页游戏场景打包与加载

    3D游戏中,一个场景往往斗劲大,若是游戏的进行须要下载一个10M甚至更大的场景时,加载所用的时候会导致很大项目组玩家的流失. 我们知道Unity3D中的内置地形是应用一张高度图,对其地形进行打包今后, ...

  7. 【Unity3d】3d网页游戏场景打包与加载

    http://www.mysjtu.com/page/M0/S716/716482.html 3d游戏中 一个场景往往斗劲大 若是游戏的进行须要下载一个10M甚至更大的场景时 加载所用的时候会导致很大 ...

  8. 3D网页游戏场景打包与加载

    3D游戏中,一个场景往往斗劲大,若是游戏的进行须要下载一个10M甚至更大的场景时,加载所用的时候会导致很大项目组玩家的流失. 我们知道Unity3D中的内置地形是应用一张高度图,对其地形进行打包今后, ...

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

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

  10. Assetbundle打包及加载入门详解(二)

    接着上篇,本节写如何更加科学的打包,以及打包中的一些依赖关系. 科学打包: 一般来说会把物体打成一个assetbundle包,把材质打成另个包,然后在加载的时候都加载出来. 当然如果是有的模型会频繁更 ...

最新文章

  1. 前端小纠结--集成gitflow和standard-version使用
  2. 忘记mysql数据库名称_忘记MySQL数据库密码的解决办法
  3. 操作系统实践(四/五)
  4. 奥林匹克公园的《老北京四重奏》
  5. 【kafka】InvalidReplicationFactorException: Replication factor: 1 larger than available brokers: 0
  6. Batis-iBatis基本操作(增删改查)
  7. 转: ASP.NET2.0_缓存
  8. java游戏运行_用jar包运行带GUI的java游戏
  9. pr22.5最新版下载地址
  10. pentaho安装mysql驱动_在Pentaho数据集成中安装MySQL JDBC驱动
  11. 用maven-replacer插件选择正则表达式替换
  12. 神秘的百度工业互联网,到底有多厉害?
  13. 鸟哥惠新宸:PHP 7.1 的新特性我并不是很喜欢
  14. html自动分列,文字的自动分列 flex 弹性盒子的一些使用方法
  15. python conda安装与使用教程
  16. 北京工业大学计算机考研录取名单,2018年北京工业大学考研拟录取名单公示——信息学部...
  17. 听说火狐要换Logo,网友们掀起了一场“战争”
  18. 社区宠物诊所管理系统
  19. web前端开发与应用——选择器
  20. 混沌加密算法python_基于混沌Logistic加密算法的图片加密与还原

热门文章

  1. javaScript学习手册:JS对象
  2. 解决SVN Cleanup时遇到错误信息:Cleanup failed to process the following paths的错误
  3. [每日一氵] openCV drawMatches 函数中 flag 用法
  4. CentOs7 中安装 guetzli 详细教程
  5. 为什么别人报价成单,而你不行?
  6. QTableView实现excel冻结窗口功能
  7. elvui显示服务器,魔兽世界怀旧服ElvUI插件
  8. 程序员到CTO的Java技术路线图
  9. poj百炼nbsp;2801:填词
  10. specification jpa 复杂查询