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

依赖性打包

依赖性打包的作用在于避免资源冗余,同时提高资源加载和卸载的灵活性,其重要性不言而喻。在4.x版本的AssetBundle打包系统中,涉及一对 BuildPipeline.PushAssetDependencies和BuildPipeline.PopAssetDependencies接口,从官方文档中可以大致了解其用法:http://docs.unity3d.com/ScriptReference/BuildPipeline.PushAssetDependencies.html

可以简单地认为,PushAssetDependencies是将资源进栈,PopAssetDependencies是让资源出栈,每打一个包,引擎都会检查当前栈中所有的依赖项,查看是否有相同资源已经在栈中。如有,则与其相关的AssetBundle建立依赖关系。

  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.png");
        BuildPipeline.BuildAssetBundle(sharedAsset, null, SavePath + sharedAsset.name + ".assetbundle", buildOp, BuildTarget.StandaloneWindows);

        // Prefab1,引用了Tex1.png
        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.png
        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", 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都打完整包,得到的包的大小为:

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

时间: 2024-11-04 09:33:22

Unity AssetBundle共享资源打包/依赖资源打包的相关文章

Unity AssetBundle打包与资源更新

Unity的AssetBundle打包是一件让人头疼的事情,当我接手这项工作时,我以为最多只用两个周就可以把整个打包和资源热更新的流程搞定,结果还是花了一个月,期间踩坑无数,总结出来希望能够节约别人的时间. (一)你的游戏项目是什么类型的? 在开始写打包的Editor脚本之前,你最好先详细考察一下你们的游戏项目是什么类型?是端游,手游还是页游?因为这三者涉及到bundle包的资源管理策略截然不同,如果你们是跨平台发布,那我建议你最好用宏来切换管理策略. 我先分享一下我曾经接手过打包工作的两个项目

Unity手游之路<十一>资源打包Assetbundle

http://blog.csdn.net/janeky/article/details/17652021 在手游的运营过程中,更新资源是比不可少的.资源管理第一步是资源打包.传统的打包可以将所有物件制成预设Prefab,打包成场景.今天我们来一起学习官方推荐的Assetbundle,它是Unity(Pro)提供的资源打包策略.利用AssetBundle,可以将几乎所有的资源都打包封装,便于客户端更新下载新的资源. (转载请注明原文出处http://blog.csdn.net/janeky/art

Unity3D中实现按资源名称自动化命名打包AssetBundle

1. 概述 一般当需要打包成AssetBundle的资源不多时,可以自己通过AssetLabels窗口手动命名,然后再打包,但是当需要打包的资源过多时,一个一个的去手动编辑就特别的麻烦,因此如果能按资源名称自动命名打包AssetBundle,这样子就会方便很多. 实现功能:只需点击一下"AutoBuildAll",即可将指定目录的资源全部自动生成按文件名称命名的AssetBundle,如下所示. 2. 实现的主要思路 第一步,强制删除原有的AssetBundle标签,避免把不必要的资源

【小松教你手游开发】【unity系统模块开发】Unity Assetbundle打包笔记

*最近项目更新了Unity5.5.2,顺便更新了项目的ui打包,也更新一下这边的笔记 首先打包分为两部分,一部分是打包成Assetbundle包,一部分是从Assetbundle包解包出来成为可用的资源. 首先说第一部分 打包 所有资源都可以打包,甚至不是资源(一些数据)也可以打包,只要你需要. 打包出来的东西都可以直接用,一个字体,一个Texture,一个Prefab,一个场景,都是一打出来成Assetbundle包就可以直接用,但是为什么大家还是要各自开发自己的打包流程呢? 最重要的原因就是

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

using UnityEngine; using System.Collections; using UnityEditor; public class dabao : EditorWindow { /* * 主要就这俩东西 - -. *BuildPipeline.PushAssetDependencies():依赖资源压栈: BuildPipeline.PopAssetDependencies():依赖资源出栈. */ [MenuItem("z/make")] static void

[Unity AssetBundle]Asset资源处理

什么是AssetBundle 在很多类型游戏的制作过程中,开发者都会考虑一个非常重要的问题,即如何在游戏运行过程中对资源进行动态的下载和加载.因此,Unity引擎引入了AssetBundle这一技术来满足开发者的需求. AssetBundle是Unity引擎提供的一种用户存储再远的文件格式,它可以存储任意一种Unity引擎能够识别的资源,例如模型.纹理.音频.动画甚至整个场景. 同时,AssetBundle也可以包含开发者自定义的二进制文件,只需要将二进制文件的扩展名改成.bytes,Unity

MVC中将视图也打包成资源随程序集一起发布

利用asp.net MVC的扩展性,我们可以重新定义视图引擎,将视图文件*.cshtml也一并打包到程序集中. 这样可以提高基于MVC框架的程序集的独立性,简化部署难度. 首选重新定义一个视图引擎: 源码如下: namespace Helpers { /// <summary> /// 对标准的RazorViewEngine扩展,以使得视图引擎能找到程序集中打包的资源作为视图 /// </summary> public class ResViewEngine : RazorView

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

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8744683 我们知道,在一个APK文件中,除了有代码文件之外,还有很多资源文件.这些资源文件是通过Android资源打包工具aapt(Android Asset Package Tool)打包到APK文件里面的.在打包之前,大部分文本格式的XML资源文件还会被编译成二进制格式的XML资源文件.在本文中,我们就详细分析 XML资源文件的编译和打包

vue项目打包部署-----解决打包后访问资源失败问题

vue项目打包部署-----解决打包后访问资源失败问题. 本文链接:https://blog.csdn.net/kaola_l/article/details/80497490 打包之前需要修改如下配置文件: 配置文件一:build>>utils.js (修改publicPath:"../../" , 这样写是处理打包后找不到静态文件的问题) 配置文件二:config>>index.js(修改assetsPublicPath:'./' ,修改目的是为了解决js找