说明:这是一系列循序渐进的教程,今天先介绍最简单的AssetBundle打包方式。

这是一个由在Unity中需要加载模型而引发出来的一系列坑,为了填坑花了不少时间,如果有需要在Unity中自定义菜单,或者创建窗口,扩展编辑器,特别是有需要打包AssetBundle包的筒子们,请看过来←_←

在Unity中载入模型最简单的方式是直接将模型文件放到工程目录下,然后拖进场景中。但是如果我们需要在程序运行时将网络或任意目录下的模型加载到场景中,那么我们只能自己编写解析模型文件的脚本。因为Unity并没有提供加载模型的API,也可能是没有开放给用户。这个过程很痛苦,而且总是有意想不到的错误,模型格式也千奇百怪。Unity自己的格式是.prefab文件,也就是预制体,使用方便,也不会出错,因为所有资源都打包在了一起。但问题是Unity加载Prefab的API只有两个,一是Resource.Load,需要将prefab文件放在Resource目录下;二是AssetDatabase.LoadAssetAtPath,文件必须在Assets目录下。这就意味着网络上和其他文件夹下的prefab是无法加载的。

幸好,还有AssetBundle可以用,我们可以通过WWW加载AssetBundle,这样就没有文件路径的限制了。

那么接下来的 问题就是如何打包AssetBundle了,在Unity5之前,可以通过BuildPipeline.BuildAssetBundle这个API来打AssetBundle包。但是很不幸,在Unity5之后,这个API就被废弃了。Unity提供了一个新的API来打AssetBundle包。

public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);

要使用这个API打包还得费一番周折。首先要在你的工程中创建一个Editor文件夹(如果没有的话),然后在Editor文件下新建一个脚本,名字自己定。然后输入如下代码:

  1.  
    [MenuItem("AssetBundle/Package (Default)")]
  2.  
    private static void PackageBuddle() {
  3.  
    Debug.Log("Packaging AssetBundle...");
  4.  
    string packagePath = UnityEditor.EditorUtility.OpenFolderPanel ("Select Package Path", "F:/", "");
  5.  
    if (packagePath.Length <= 0 || !Directory.Exists (packagePath))
  6.  
    return;
  7.  
    Debug.Log ("Output Path: " + packagePath);
  8.  
    BuildPipeline.BuildAssetBundles (packagePath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
  9.  
    AssetDatabase.Refresh ();
  10.  
    }

保存后切换到Unity,你就会看到你的Unity跟以前不一样了。在菜单栏多了一个叫做AssetBundle的菜单,点开这个菜单,还有一个叫Package (Default)的子菜单,就是这么神奇。点击Package (Default)菜单,就会运行上面我们写的PackageBundle函数了。不信你看Console窗口,已经有东西打印出来了。

说明一下:

第一,这个脚本必须放在Editor文件夹下才会有效;

第二,使用[MenuItem("AssetBundle/Package (Default)")]创建菜单时,必须有子菜单,否则主菜单会被忽略,不会创建。

第三,UnityEditor.EditorUtility.OpenFolderPanel这个API会弹出一个文件夹选择窗口,返回你选择的路径。要注意BuildAssetBundles打包时不会创建文件夹,也就是说你必须保证你带入的路径是存在的,否则就会出错。

现在打Asset包的功能就写好了,下面的问题是怎么用?

首先,点击某个prefab文件,看图↓

在Inspector面板的最下面有个预览区域,就是在这里设置哪些文件需要打包的。

AssetBundle后面有个下拉按钮,点击一下,看下图↓

点击new,输入名字,这就是这个文件打包后的名字,后面第二个None是后缀名,可以不用填,但是如果填的话也要注意好像不是任意字符串都行的。这也就是说AssetBundle包是没有固定后缀名的,你可以输入任何后缀名,也可以没有后缀名,都能打包成功,也能正确加载。

说明:

只有AssetBundle后面名字不能None的文件才会被BuildAssetBundles函数打包,为None的都不会打包。

当看到BuildAssetBundles函数时,我也一脸懵逼,参数中居然没有可以输入要打包文件的地方??其实Unity是把这个参数移到Inspector面板中了,在调用BuildAssetBundles函数时,只要Inspector面板中设置了AssertBundle名字的文件都会被打包。

设置完成以后,点击菜单AssetBundle→Package (Default),你会看到出现了一个现实进度的窗口,这就是Unity正在打包文件。

去你选择的文件夹下,你可以看到多了四个文件,AssetBundle包已经打包好了,下面解释下这四个文件,看图↓

我是将它们打包在ksvk_prefab文件夹下,ksvk_prefab和ksvk_prefab.manifest是和文件夹相关的,没啥用;ksvk_prefab.assetbundle和ksvk_prefab.assetbundle.manifest是我选择的文件打出的包,加载的时候直接加载ksvk_prefab.manifest文件就行了。.manifest是清单文件,里面记录了循环冗余校验(CRC)数据和捆绑文件的依赖信息等。

今天的教程就到这里了,这才是刚刚开始,后面才是高能开启。

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

  1. 实力封装:Unity打包AssetBundle(大结局)

    →→前情提要:让用户选择要打包的文件←← 大结局:更多选择 Unity打包AssetBundle从入门到放弃系列终于要迎来大结局了[小哥哥表示实在写不动了o(╥﹏╥)o]... 经过上一次的教程,其实 ...

  2. 实力封装:Unity打包AssetBundle(三)

    前情提要:第二种打包方式 窗口初现 通过前面的两篇教程和一篇番外,我们已经完全实现了打包的功能.但是使用起来总是觉得有些晦涩别扭,如果不告诉别人怎么使用,对方肯定是一头雾水. What?你给我的这是啥 ...

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

    →前情提要:Unity最基本的AssetBundle打包方式. 第二种打包方式 Unity提供的BuildAssetBundles API还有一个重载形式,看下面↓↓ public static As ...

  4. 实力封装:Unity打包AssetBundle(四)

    →→前情提要:窗口初现←← 让用户选择要打包的文件 时至今日,我们选择打包文件的方式依然是在Project面板或Hierarchy面板中用鼠标点选.现在既然有了窗口,我们自然希望可以将所有文件罗列在窗 ...

  5. 实力封装:Unity打包AssetBundle(番外篇)

    前情提要:第二种打包方式. 自定义AssetBundle包扩展名 在之前的教程中,我们已经多次提到过扩展名了,并且也已经说明了如何设置自定义的AssetBundle扩展名.至于为什么还要把它单独拿出来 ...

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

    http://blog.csdn.net/janeky/article/details/17652021 在手游的运营过程中,更新资源是比不可少的.资源管理第一步是资源打包.传统的打包可以将所有物件制 ...

  7. Unity 5.X扩展编辑器之打包assetbundle

    5.x的assetbundle与4.x以及之前的版本有些不同,不过本质是一样的,只不过5.x打包assetbundle更为简单和人性化了,总体来说只需要三个步骤: 第一步:创建打包资源 //这里是一个 ...

  8. Unity打包/读取AssetBundle资源全教程

    Unity 资源AssetBundle打包 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar ...

  9. 【Unity】AssetBundle的使用——打包/解包

    最近参考了各位大神的资源,初步学习了Unity的资源管理模式,包括在编辑器管理(使用AssetDatabase)和在运行时管理(使用Resources和AssetBundle).在此简单总结运行时用A ...

随机推荐

  1. LeetCode--290--单词模式

    问题描述: 给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式. 这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之 ...

  2. 什么是EOS(不一样的角度看柚子)

    是时候给写写EOS了,现在EOS主网已经上线,尽管我个人不是很喜欢EOS项目(不过也一直在关注EOS),但是不可否认EOS这个争议性很大的项目给区块链世界带来的变化. 写在前面 阅读本文前,如果了解过 ...

  3. 有标号的DAG计数

    看了某神仙博客学了一手,基本的思路就是容斥入度为0的点. n^2做法. F(n)=sigema i (-1)^(i-1)✖ C(n,i)✖ F(i)✖ 2^(j*(i-j)) nlogn做法 对上述式 ...

  4. Routing a Marathon Race

    直接爆搜的复杂度是2^n,对于n<=40的数据过不了. 考虑优化一下. 发现如果走了一个点后,以后是不可能再经过与它相邻的点的,因为这样走显然不如直接走那个与它相邻的点. 这样每走一步就可以删掉 ...

  5. 维护满足max(+ or -)min<=k的区间

    这是一种经典的单调栈+线段树的维护方法. 从左到右枚举右端点. 线段树维护每一个左端点的max(+ or -)min的值. 每次右端点移动的时候,把a[i]加入单调栈. 每弹栈一次,便在线段树上把对应 ...

  6. 基于Helm和Operator的K8S应用管理的分享

    一.为啥要用helm 对于一些微服务架构来说,会有不同的服务在上面运行,你可能要管理诸如deployment.service.有状态的Statefulset.权限的控制等等.你会发现,部署应用后还会有 ...

  7. python 小练习2

    给你一个整数列表L,判断L中是否存在相同的数字, 若存在,输出YES,否则输出NO.解1l=[]for i in L:    if L.count(i) != 1:        print('YES ...

  8. VCG(VisualCodeGrepper)安装使用教程

    一.说明 代码审计工具看来还是比较难做,一是开源的代码审计工具少,二是原本的一些开源审计工具很多都不更新甚至不能使用了. VCG支持审计C++.Java.C#.PHP和VB,但其“审计”基本相当于函数 ...

  9. Java多线程中对CountDownLatch的使用

    CountDownLatch是一个非常实用的多线程控制工具类,称之为“倒计时器”,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.用给定的计数初始化CountDownLatch,其含义 ...

  10. VMware workstation 14 Pro下载、安装及激活码

    虚拟机安装 1.百度搜索VMware应用程序 2.功能介绍 3.下载完成 4.开始安装 双击应用程序开始安装 5.点击“下一步” 6.勾选“我接受” 选择“下一步” 7.安装文件的选择:1.默认安装路 ...