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

  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.tga
Object sharedAsset = AssetDatabase.LoadMainAssetAtPath("Assets/Resources/Test/Tex1.tga");
BuildPipeline.BuildAssetBundle(sharedAsset, null, SavePath + sharedAsset.name + ".assetbundle", buildOp, BuildTarget.StandaloneWindows); // Prefab1,引用了Tex1.tga
BuildPipeline.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.tga
BuildPipeline.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", ));
} if (GUI.Button(new Rect(0f, 60f, 100f, 20f), "Load And Instantiate Prefab"))
{
StartCoroutine(LoadAndInstantiate(@"file://C:\P1.assetbundle", ));
StartCoroutine(LoadAndInstantiate(@"file://C:\P2.assetbundle", ));
}
} // 加载
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. (转)[Unity3D]BuildPipeline.PushAssetDependencies 打包依赖包,优化UI Prefab的资源引用加载(坑爹之处)

    转自:http://blog.csdn.net/chiuan/article/details/39040421#reply 1:长话短说,UI Prefab中一般会交叉引用Atlas,那么打包时候我们 ...

  3. AssetBundle系列——场景资源之打包(一)

    本篇讲解的是3D游戏的场景资源打包方式,首先简单的分析一下场景中所包含的资源的类型. 场景资源一般包含:地表模型(或者是Unity Terrain),非实例化物体(摄像机.空气墙.光源.各种逻辑物体之 ...

  4. [Unity3D] 5.0 图集合并扩展工具,用于解决UGUI与AssetBundle打包造成资源包过大的问题

    [Unity3D] 5.0 图集合并扩展工具,用于解决UGUI与AssetBundle打包造成资源包过大的问题 2017年07月05日 15:57:44 阅读数:1494 http://www.cpp ...

  5. AssetBundle打包依赖(宽宽又欠我一顿烧烤)

    using UnityEngine; using System.Collections; using UnityEditor; public class dabao : EditorWindow { ...

  6. Webpack:前端资源模块化管理和打包工具

    一.介绍: Webpack 是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生 产环境部署的前端资源.还可以将按需加载的模块进行代码分隔,等到实际需要的时候再 ...

  7. AssetBundle系列——资源的加载、简易的资源管理器

    每个需要进行资源管理的类都继承自IAssetManager,该类维护它所使用到的所有资源的一个资源列表.并且每个资源管理类可以重写其资源引用接口和解引用接口. 每个管理器有自己的管理策略,比如Scen ...

  8. AssetBundle系列——场景资源之解包(二)

    本篇接着上一篇继续和大家分享场景资源这一主题,主要包括两个方面: (1)加载场景 场景异步加载的代码比较简单,如下所示: private IEnumerator LoadLevelCoroutine( ...

  9. Android应用程序资源的编译和打包过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8744683 我们知道,在一个APK文件中,除了 ...

随机推荐

  1. 使用vs自带的性能诊断工具

    visual studio是个强大的集成开发环境,内置了程序性能诊断工具.下面通过两段代码进行介绍. static void Main( string[] args) { Test1(); Test2 ...

  2. phpMyAdmin 登陆需要密码

    网页设计从事者在学习网页时都用过 "xampp" 这款软件吧. 本人今天正常使用时,系统提示可升级 phpMyAdmin.当前最新版本为:phpMyAdmin-4.6.4-all- ...

  3. animate.css

    这是个css3动画框架,现在很流行,在小动画效果有很多,使用的方式 <div class="animated bounce"></div> /*只要修改bo ...

  4. asp.net关于页面不回发的问题,寻求完美解决方案

    原文地址:http://www.sufeinet.com/thread-4564-1-1.html 这个问题我相信有不少人见过,就是使用系统的分页功能时,或者是使用系统控件,都会有一个回发的功能, 这 ...

  5. java中获取比毫秒更为精确的时间

    所以这里提醒做非常精确的时间统计的朋友,谨慎使用System.currentTimeMillis() . 在Java中可以通过System.currentTimeMillis()或者System.na ...

  6. sonar的安装与代码质量检测实例

    说明:sonar依赖数据库. mysql优化 1.笔者使用的是mysql数据库.首先对mysql做简单的优化配置. [root@localhost bin]# cat /etc/my.cnf [mys ...

  7. [纯干货] MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  8. Infer初体验 for Android

    安装Python Infer下载地址:https://github.com/facebook/infer 配置环境变量 vi ~/.bash_profile #infer export PATH=${ ...

  9. 【Python】winpython下的包安装

    1.安装easy_install http://blog.csdn.net/A8572785/article/details/10945237 2.与ipython兼容的ipdb命令 pip inst ...

  10. 老王教您怎么做cass7.1 8.0 9.1所有系列的复制狗 加密狗 破解狗

    cass7.1 8.0 9.1所有系列的复制狗 加密狗 破解狗本来是出于好奇看到网上有这样的东西,学了下感觉挺简单的,如果你是cass的初学者想仅仅是想学习这个软件,不想花大价格购买正版的,这个是可以 ...