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

 说明:这是一系列循序渐进的教程,今天先介绍最简单的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文件下新建一个脚本,名字自己定。然后输入如下代码:


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

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


说明一下:

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

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

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


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

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

实力封装:Unity打包AssetBundle(一)_第1张图片

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

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

实力封装:Unity打包AssetBundle(一)_第2张图片

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


说明:

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


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


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


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

实力封装:Unity打包AssetBundle(一)_第3张图片

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


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

你可能感兴趣的:(unity)