如何实现 AssetBundle 的依赖部分从 Resource 获取

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现 AssetBundle 的依赖部分从 Resource 获取相关的知识,希望对你有一定的参考价值。

参考技术A   Unity会下载Assetbundle本地中,它的工作原理是先通过(版本号和下载地址)先在本地去找看有没有这个Assetbundle,如果有直接返回对象,如果没有的话,在根据这个下载地址重新从服务器或者本地下载。这里版本号起到了很重要的作用,举个例子,同一下载地址版本号为1的时候已经下载到本地,此时将版本号的参数改成2 那么它又会重新下载,如果还保持版本号为1那么它会从本地读取,因为本地已经有版本号为1的这个Assetbundle了。你不用担心你的资源本地下载过多,也不用自己手动删除他们,这一切的一切Unity会帮我们自动完成,它会自动删除掉下载后最不常用的Assetbundle ,如果下次需要使用的话只要提供下载地址和版本后它会重新下载。
  我们在聊聊Assetbundle 中的脚本,在移动平台下Assetbundle里面放的脚本是不会被执行的,还记得我们打包前给两个Prefab挂上了脚本吗?在手机上将Assetbundle下载到本地后,加载进游戏中Prefab会自动在本地找它身上挂着的脚本,他是根据脚本的名来寻找,如果本地有这条脚本的话,Prefab会把这个脚本重新绑定在自身,并且会把打包前的参数传递进来。如果本地没有,身上挂的条脚本永远都不会被执行。
  在Prefab打包前,我在编辑器上给脚本中的变量 name 赋了不同值,当Prefab重新载入游戏的时候,它身上脚本的参数也会重新输出。

  如果你的Assetbundle中的Prefab上引用的对象,那么这样做就会出错了,你需要设定他们的依赖关系。或者运行时通过脚本动态的载入对象。
参考技术B Unity会下载Assetbundle本地中,它的工作原理是先通过(版本号和下载地址)先在本地去找看有没有这个Assetbundle,如果有直接返回对象,如果没有的话,在根据这个下载地址重新从服务器或者本地下载。这里版本号起到了很重要的作用,

Assetbundle包的依赖关系与加载方式的深入

两种压缩方式:Lzma (默认的), Lz4

四种加载方法:

1,从内存中加载:LoadfromMemory()内存

2,从本地加载:LoadFromFile

3,从本地或服务器加载www(下面会提到)

4,从服务器端加载unityWebRequest

加载依赖资源包

1,获得总的依赖配置(streamingAssets)

2,根据名称找到目标加载资源的所有依赖

3,加载所有的依赖资源

加Lua脚本Lua格式改为bytes后缀文件

资源路径:

Application.datapath;

Application.streamingAssetsPath(只读不可写)

Application.persistentDataPats(特殊 可读可写 运行时!)

Application.temporarycachePath

1,Windows.manifest(总的配置文件)

依赖关系:一个东西要完整的显示出来,必须要另外一个东西。

2,单个Assetbundle包配置文件:里面记录的是

(1)单个Assetbundle里面的资源

(2)记录单个Asssetbundle的依赖关系

bundle包的依赖关系加载:

技术图片

 

 (哈哈哈 机智如我 上图是举例 )

第一个的:

加载A需要做些什么事情那?

1,加载B和C

2,加载A

卸载A?

1,先卸载B,C依赖关系

2,判断B,C是否有依赖 B,C卸载

第二个:

加载A?

1,判断依赖关系A判断B,C  |B,C判断D

卸载B?

1,只能卸载B,D关系

卸载C?

1,卸载C,D关系

2,卸载D

插个小话题

引用计数:

Gc机制也是存在引用计数的关系: 被谁引用(List<>) 引用的谁(List<>)

下面是bundle包三块内存存放与加载方式

技术图片

 

 1,bundle包放在网络用WWW加载然后加载到本地,bundle包在本地用Assetbundle.LoadFromFile方法加载(内存镜像)

释放内存:Assetbundle.Unload(false)

2,解压Assetbundle:Assetbundle.Load()将镜像里的zip包解压出来

释放内存:Resource.Unloadasset(obj)只能卸载obj类型 shader 网格 材质 贴图都不能卸载 而Resource.Unloadunusedasset()用这个API释放 shader 网格 材质 贴图

3,GameObjece.instance使用解压出来的资释

释放内存:Destroy()

 

以上是关于如何实现 AssetBundle 的依赖部分从 Resource 获取的主要内容,如果未能解决你的问题,请参考以下文章

Unity AssetBundle共享资源打包/依赖资源打包

UnityAssetBundle和AssetBundle Manager的使用和介绍(流程和依赖关系)

UnityAssetBundle和AssetBundle Manager的使用和介绍(流程和依赖关系)

Unity AssetBundle(1):Assets打包和依赖(Dependencies)理解

Unity 浅谈AssetBundle 游戏资源

AssetBundle使用心得(转)