有人在之前的博客中问我有关共享资源打包的代码,其实这一块很简单,就两个函数:

  BuildPipeline.PushAssetDependencies():依赖资源压栈;

  BuildPipeline.PopAssetDependencies():依赖资源出栈。

  直接看代码,下面为打包示例代码,Prefab1和Prefab2共享贴图资源Tex1,在打包时将Tex1单独打包,而Prefab1和Prefab2对应的assetbundle包中不实际包含Tex1资源,而是记录Tex1资源的引用:

using UnityEditor;
using UnityEngine;
using System.IO;
using System.Collections;
using System.Collections.Generic;public class PushAndPop
{[MenuItem("Test/BuildAssetBundle")]static void Execute(){string SavePath = "C:\\";BuildAssetBundleOptions buildOp = BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets | BuildAssetBundleOptions.DeterministicAssetBundle;BuildPipeline.PushAssetDependencies();// 共享资源Tex1.tgaObject sharedAsset = AssetDatabase.LoadMainAssetAtPath("Assets/Resources/Test/Tex1.tga");BuildPipeline.BuildAssetBundle(sharedAsset, null, SavePath + sharedAsset.name + ".assetbundle", buildOp, BuildTarget.StandaloneWindows);// Prefab1,引用了Tex1.tgaBuildPipeline.PushAssetDependencies();Object p1Asset = AssetDatabase.LoadMainAssetAtPath("Assets/Resources/Test/P1.prefab");BuildPipeline.BuildAssetBundle(p1Asset, null, SavePath + p1Asset.name + ".assetbundle", buildOp, BuildTarget.StandaloneWindows);BuildPipeline.PopAssetDependencies();// Prefab2,引用了Tex1.tgaBuildPipeline.PushAssetDependencies();Object p2Asset = AssetDatabase.LoadMainAssetAtPath("Assets/Resources/Test/P2.prefab");BuildPipeline.BuildAssetBundle(p2Asset, null, SavePath + p2Asset.name + ".assetbundle", buildOp, BuildTarget.StandaloneWindows);BuildPipeline.PopAssetDependencies();BuildPipeline.PopAssetDependencies();EditorUtility.DisplayDialog("", "Completed", "OK");AssetDatabase.Refresh();}}

  可以看到,Push和Pos都是成对使用,一个Push/Pop对就相当于一个Layer(层),层可以嵌套,内层可以依赖外层的资源。也就是说内层某资源在打包时,如果其引用的某个资源已经在外层加载了,那么内层的这个资源包就会包含该资源的引用而不是资源本身。Push/Pop实际上维持了一个依赖的堆栈。

  那么,在加载依赖资源包时,需要注意的是:先加载依赖的资源,然后加载其他资源,需要确保这个顺序。下面的代码演示如何使用依赖资源包:

using UnityEngine;
using System.Collections;public class NewBehaviourScript : MonoBehaviour
{void OnGUI(){// 清空本地缓存if (GUI.Button(new Rect(0f, 0f, 100f, 20f), Caching.spaceOccupied.ToString())){Caching.CleanCache();}if (GUI.Button(new Rect(0f, 30f, 100f, 20f), "Load Share Res")){StartCoroutine(Load(@"file://C:\Tex1.assetbundle", 1));}if (GUI.Button(new Rect(0f, 60f, 100f, 20f), "Load And Instantiate Prefab")){StartCoroutine(LoadAndInstantiate(@"file://C:\P1.assetbundle", 1));StartCoroutine(LoadAndInstantiate(@"file://C:\P2.assetbundle", 1));}}// 加载IEnumerator Load(string url, int version){WWW www = WWW.LoadFromCacheOrDownload(url, version);yield return www;}// 加载并实例化IEnumerator LoadAndInstantiate(string url, int version){WWW www = WWW.LoadFromCacheOrDownload(url, version);yield return www;if (!System.String.IsNullOrEmpty(www.error)){Debug.Log(www.error);}else{Object main = www.assetBundle.mainAsset;GameObject.Instantiate(main);}}}

  先按第二个按钮,然后再按第三个按钮就能够正确显示两个Prefab,如果直接进行第三步操作,则实例化出来的Prefab会缺少贴图。

  另外我们可以从assetbundle包的大小来看一下:

  如果不打依赖包,两个prefab都打完整包,得到的包的大小为:

  P1.assetbundle      56K

  P2.assetbundle      38K

  如果打依赖包,得到的包的大小为:

  Tex1.assetbundle      10k

  P1.assetbundle      47K

  P2.assetbundle      29K

  规律是不是很明显。

(转)AssetBundle系列——共享资源打包/依赖资源打包相关推荐

  1. AssetBundle系列——共享资源打包/依赖资源打包

    有人在之前的博客中问我有关共享资源打包的代码,其实这一块很简单,就两个函数: BuildPipeline.PushAssetDependencies():依赖资源压栈: BuildPipeline.P ...

  2. aar打包依赖 android_打包依赖.aar文件以及坑总结

    http://blog.csdn.net/u010134293/article/details/53374804 一.打包aar 1.单个模块打包 打开Gradle工具窗口,找到Android Lib ...

  3. Unity5.x 依赖关系打包 AssetBundle 研究

    Unity5.x新依赖打包及加载 https://blog.csdn.net/strugglebydreamlin/article/details/78031086 demo:https://pan. ...

  4. 线程间到底共享了哪些进程资源?

    进程和线程这两个话题是程序员绕不开的,操作系统提供的这两个抽象概念实在是太重要了. 关于进程和线程有一个极其经典的问题,那就是进程和线程的区别是什么?相信很多同学对答案似懂非懂. 记住了不一定真懂 关 ...

  5. Android资源初探(一) 资源打包

    Android中的资源也是一块比较重要的知识,平时工作中除了简单的使用context.getResouce().getColor(R.id.xxx)之外,我们也更想了解背后的原理.接下来的系列文章从资 ...

  6. iOS架构-静态库.a打包之资源文件打包成bundle(4)

    iOS架构-静态库.a的打包及使用(一) iOS架构-静态库.a的脚本化打包及使用(二) 资源文件主要包括:xib.图片以及其他文件资源(json.string等).这里主要介绍 xib.图片.其他的 ...

  7. webpack5打包普通html项目,webpack打包其他资源

    webpack打包其他资源文件 图片打包 file-loader的使用 css内引入图片资源 安装 npm install file-loader -D outputPath:图片文件打包的放在哪个文 ...

  8. Unity 打包和读取AB资源,并播放打包的AB序列图!

    Unity - 打包和读取AB资源,并播放打包的AB序列图! 一:效果图 二:插件下载 三:插件导入! 三:代码! 四:Demo学习 五:关于AB资源打包的学习和拓展 本文提供详细教程 记录遇到的难点 ...

  9. 线程间到底共享了哪些进程资源

    进程和线程这两个话题是程序员绕不开的,操作系统提供的这两个抽象概念实在是太重要了. 关于进程和线程有一个极其经典的问题,那就是进程和线程的区别是什么?相信很多同学对答案似懂非懂. 记住了不一定真懂 有 ...

最新文章

  1. yum安装软件包提示Error Downloading Packages解决方法
  2. 没有可用于当前位置的源代码
  3. servlet 认证,授权
  4. PHP问题 —— Notice: Undefined index:
  5. Chrome OS 72.0.3626.117 发布
  6. Java实现二维码扫码授权登陆
  7. 微信小程序云数据库使用讲解
  8. 统计数字liuseroj.picp.io
  9. OfficeExcel(5)
  10. 一个故事告诉你,压力真的可以击垮一个人
  11. Vue 2.0 真实点餐项目实战
  12. WIN10系统 插上耳机没声音,解决方案
  13. Python super( ) 函数详解
  14. 记一次《C语言踩内存》问题定位有感
  15. 长难句结构分析最新经典一百句
  16. 盖茨基金会宣布再追加捐赠1.5亿美元,支持全球新冠肺炎响应行动
  17. zt_阿里张瑞jacky关于library cache的内部管理机制
  18. Howler.js音频播放终极解决方案
  19. 2.2.8 SEA Shared Ethernet Adapter共享以太网卡
  20. Windows安装Apache服务器及证书

热门文章

  1. day2-安装python以及基本使用
  2. Poco官方PPT_020-ErrorHandlingAndDebugging双语对照翻译
  3. 微信小程序swiper滑块视图容器控件使用整理
  4. 2.3.14 Python 函数进阶-生成器
  5. [学习笔记] Cordova+AmazeUI+React 做个通讯录 - 使用 SQLite
  6. 如何对CentOS FTP服务配置 - 51CTO.COM
  7. 博世 40 亿欧元押注自动驾驶,Waymo 准备接招吧
  8. openstack之镜像管理
  9. firewalld 极速上手指南
  10. ALERT日志中常见监听错误:ORA-3136错误的排查