说明:这是一系列循序渐进的教程,今天先介绍最简单的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. linux进程管理之进程查看

    查看进程 process ====================================================================================了解如 ...

  2. cmd下可以启动java,输入javac提示 不“存在”

    方法:手动把JDK安装目录的bin目录配置到PATH环境变量里

  3. Seagull License Server 9.4 SR3 2781 完美激活(解决不能打印问题)

    BarTender 9.4 SR3完美激活方法 网上下载的BarTender 9.4大部分不能正常打印,已经测试过了,完美解决无法打印,界面停留在“无法打印,出现正在试图连接到seagull lice ...

  4. Event IO Process

    先了解一下process和event loop EventLoop 除了异步Server和Client库之外,Swoole扩展还提供了直接操作底层epoll/kqueue事件循环的接口.可将其他扩展创 ...

  5. FTP服务器搭建(Centos7)

    1.1.1 查看是否安装vsftp rpm -qa | grep vsftpd 1.1.2 如果没有安装: yum -y install vsftpd 1.2.3 vsftpd.conf 配置文件 匿 ...

  6. swiper添加了自动滚动效果,然后用手指划过页面,发现自动滚动效果不生效了

    我给swiper添加了自动滚动效果,然后用手指划过页面,发现自动滚动效果不生效了,哪里出了问题呢? 添加参数 autoplayDisableOnInteraction : false,

  7. ajax常见的面试问题

    1:什么是ajax?ajax作用是什么? 异步的javascript和xml AJAX 是一种用于创建快速动态网页的技术. ajax用来与后台交互 2:原生js ajax请求有几个步骤?分别是什么 / ...

  8. WordDenified.exportedUI

    <mso:cmd app="Word" dt="1" /><mso:customUI xmlns:x1="xuzaAzWord&qu ...

  9. RWCString 定义 memeroy leak

    代码截取片段: testDefs.hh class testDefs { public: static const RWCString testStr; }; testDefs.cc const RW ...

  10. C++11 并发之std::thread std::mutex

    https://www.cnblogs.com/whlook/p/6573659.html (https://www.cnblogs.com/lidabo/p/7852033.html) C++:线程 ...