实力封装:Unity打包AssetBundle(二)

→前情提要:Unity最基本的AssetBundle打包方式。

第二种打包方式

Unity提供的BuildAssetBundles API还有一个重载形式,看下面↓↓

public static AssetBundleManifest BuildAssetBundles(string outputPath, AssetBundleBuild[] builds, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);

这个重载函数多了一个参数,这个参数是一个AssetBundleBuild数组,下面我们来说说AssetBundleBuild是何方妖孽↓↓

AssetBundleBuild是一个结构体,有四个属性,说明如下↓↓

assetBundleName string类型,打包后AssetBundle包的名字
assetNames string数组类型,AssetBundle包中每一个文件相对于工程目录的路径(一个AssetBundle包中可以有多个文件)
addressableNames string数组类型,相当于是assetNames的别名,必须和assetNames长度一致
assetBundleVariant string类型,设置AssetBundle变体,其实就是后缀名

一般情况下,只要设置AssetBundleBuild结构体中的assetBundleName属性和assetNames属性就可以了,如果你愿意给打在AssetBundle包中的文件重命名的话,就设置一下addressableNames属性,不想重命名的文件就给一个空字符串,这样默认就会使用assetNames了。要是还想设置自定义的后缀名,可以试试AssetBundleVariant。

有了AssetBundleBuild这样一个结构体数组做参数,这就意味着我们可以让打包的过程更简单了。不用在Inspector面板中给每一个需要打包的文件设置AssetBundle名称,我们可以直接在编辑器中鼠标点选需要打包的文件,然后一键打包。当然,这也就意味着我们不能随意的控制每个AssetBundle包的名字了,有利有弊吧。

在这里讲一讲打包的方式吧,我们可以把许多文件打进一个AssetBundle包,也可以将每个文件单独打一个AssetBundle包,具体怎么打就要看需求了。

下面是打包的代码↓↓

  1. [MenuItem("AssetBundles/Buil (All)")]

  2.  

    private static void _packageBuddlesInOne() {

  3.  

    string _packagePath = UnityEditor.EditorUtility.OpenFolderPanel ("Select Package Path", "F:/", "");

  4.  

    if (_packagePath.Length <= 0 || !Directory.Exists (_packagePath))

  5.  

    return;

  6.  

    buildMap[0].assetBundleName = "myBnndle";

  7.  

    //将选中对象一起打包

  8.  

    AssertBundleAssetBundleBuild[] buildMap = new AssetBundleBuild[1];

  9.  

    GameObject[] objs = Selection.gameObjects; //获取当前选中的所有对象

  10.  

    string[] itemAssets = new string[objs.Length];

  11.  

    for (int i = 0; i < objs.Length; i++) {

  12.  

    itemAssets [i] = AssetDatabase.GetAssetPath (objs [i]); //获取对象在工程目录下的相对路径

  13.  

    }

  14.  

    buildMap [0].assetNames = itemAssets;

  15.  

    AssetBundleManifest manifest = BuildPipeline.BuildAssetBundles (_packagePath, buildMap, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);

  16.  

    AssetDatabase.Refresh (); //刷新

  17.  

    if (manifest == null)

  18.  

    Debug.LogError("Package AssetBundles Faild.");

  19.  

    else

  20.  

    Debug.Log("Package AssetBundles Success.");

  21.  

    }

这样所有你选中的对象就都打进一个AssetBundle包了,建议关联或相似的文件可以这样打包。

我们也可以将每个对象都打进不同的AssetBundle包,看代码↓↓

  1. [MenuItem("AssetBundle/Build (Selected)")]

  2.  

    private static void _packageBuddleSelected() {

  3.  

    string _packagePath = UnityEditor.EditorUtility.OpenFolderPanel ("Select Package Path", "F:/", "");

  4.  

    if (_packagePath.Length <= 0 || !Directory.Exists (_packagePath))

  5.  

    return;

  6.  

    AssetBundleBuild[] buildMap = new AssetBundleBuild[objs.Length];

  7.  

    GameObject[] objs = Selection.gameObjects;

  8.  

    for (int i = 0; i < objs.Length; i++) {

  9.  

    string[] itemAsset = new string[] { AssetDatabase.GetAssetPath (objs[i]) };

  10.  

    buildMap[i].assetBundleName = objs[i].name;

  11.  

    buildMap [i].assetNames = itemAsset;

  12.  

    }

  13.  

    AssetBundleManifest manifest = BuildPipeline.BuildAssetBundles (_packagePath, buildMap, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);

  14.  

    AssetDatabase.Refresh ();

  15.  

    if(menifest == null)

  16.  

    Debug.LogError("Error:Package Failed");

  17.  

    else

  18.  

    Debug.Log("Package Success.");

  19.  

    }

[cpp] view plain copy

按↑图操作,就可以打包选中的文件了。

更多花样,现在你可以自己创造了。今天就到这儿啦,咱们下期见~

原文地址:https://www.cnblogs.com/huwenya/p/9246229.html

时间: 2024-08-02 02:40:36

实力封装:Unity打包AssetBundle(二)的相关文章

unity 打包AssetBundle

unity提供了assetbunlde机制,下面介绍一种方法将指定目录下的所有文件打包成AssetBundle 先说明步骤,再上代码. 步骤一.选择要打包成assetbundle的目录,本案例使用assetbundle_raw 步骤二.把要打包的资源或者目录都放到assetbundle_raw目录,资源可以是 prefab,png,fbx,font,audio,txt等. 步骤三.给assetbundle_raw目录下所有的资源文件设置assetbundle名称,如果是目录,会递归. 名称格式:

unity打包AssetBundle包的几种压缩方式介绍

Unity资源打包目的就是把一部分游戏资源或是需要热更的资源从游戏安装包中分离出来,降低安装包的大小,在热更或加载资源时再从服务器下载所需资源,当然已经下载的资源和不需要更新的资源不需要重复下载,Unity的打包可以也只能在unity的编辑器下进行,比如可以用unity提供的接口如下面代码所示: public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetB

Unity手游之路&lt;十一&gt;资源打包Assetbundle

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

【unity系统模块开发】Unity5.5.2UI打包AssetBundle

之前已经有几篇文章写打包AssetBundle,但毕竟没有实际在项目中写过都写的比较浅. 刚好最近项目更新Unity5.5.2就顺便由我来更新ui打包流程 这里就把这次的经验写一下 这里还是稍微解释一下打包的基本目的: 打包ui就是把你做的界面打包出来成assetbundle包,讲道理你就把每个界面打成bundle包在游戏中你就可以直接加载来用,但是这样子的话你的每个bundle包就会非常的大,为什么呢,是因为这样子每个界面的bundle包里都包含这个界面用到的字体,贴图atlas,textur

【小松教你手游开发】【unity系统模块开发】Unity5.5.2UI打包AssetBundle

之前已经有几篇文章写打包AssetBundle,但毕竟没有实际在项目中写过都写的比较浅. 刚好最近项目更新Unity5.5.2就顺便由我来更新ui打包流程 这里就把这次的经验写一下 这里还是稍微解释一下打包的基本目的: 打包ui就是把你做的界面打包出来成assetbundle包,讲道理你就把每个界面打成bundle包在游戏中你就可以直接加载来用,但是这样子的话你的每个bundle包就会非常的大,为什么呢,是因为这样子每个界面的bundle包里都包含这个界面用到的字体,贴图atlas,textur

Unity资源Assetbundle

转  Unity资源打包之Assetbundle 本文原创版权归 csdn janeky 所有,转载请详细注明原创作者及出处,以示尊重! 作者:janeky 原文:http://blog.csdn.net/janeky/article/details/17652021 如果这篇文章对你有帮助,敬请关注作者<Unity手游之路>系列教程. 在手游的运营过程中,更新资源是比不可少的.资源管理第一步是资源打包.传统的打包可以将所有物件制成预设Prefab,打包成场景.今天我们来一起学习官方推荐的As

资源打包Assetbundle .

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

UNITY打包问题

1,打包有二种,打包可执行程序-player,打包资源包-assetbundle 2,打包player后,在PC平台去看打包后对应的资源大小,发现比原始资源小得多,模型资源压缩率约60%,图资源压缩率90%左右. 打包资源包后,去看打出的assetbundle,会发现,默认压缩方式下-LZMA,达到原始资源的20%,甚至更小.LZ4压缩方式可达原始资源的40%. 3,场景资源与普通资源不能一起打包. 4,对场景设置了assetbundle标记后,场景引用的资源会被自动设置成相同的标记.这可能是场

unity 打包资源及网络请求资源包

第一步 导包 在Assets新建一个Editor目录 新建一个Test类 using UnityEngine; using System.Collections; using UnityEditor; public class Test : Editor { //打包单个 [MenuItem("Custom Editor/Create AssetBunldes Main")] static void CreateAssetBunldesMain () { Object[] Select