Unity3D AssetBundle的使用(打包)
目录
- Unity3D AssetBundle的使用(打包)
- AssetBundle介绍
- AssetBundle打包的代码实现
- 更多BuildAssetBundleOptions
- 更多BuildTarget
- 打包方法
- AssetBundle的加载
AssetBundle介绍
- 在一款游戏的开发过程中可能会遇到需要动态的获取或加载资源包的需求,这里便可以利用Unity引擎中的AssetBundle进行打包和加载。
在了解AssetBundle使用方法之前,让我们先来看一下官方对AssetBundle的介绍:
以下内容来自:Unity3D官方中文文档
AssetBundle 是一个存档文件,包含可在运行时加载的特定于平台的资源(模型、纹理、预制件、音频剪辑甚至整个场景)。AssetBundle 可以表达彼此之间的依赖关系;例如 AssetBundle A 中的材质可以引用 AssetBundle B 中的纹理。为了通过网络进行有效传递,可以根据用例要求选用内置算法来压缩 AssetBundle(LZMA 和 LZ4)。
AssetBundle 中有什么?
问得好,实际上“AssetBundle”可以指两种不同但相关的东西。
首先是磁盘上的实际文件。对于这种情况,我们称之为 AssetBundle 存档,在本文档中简称“存档”。存档可以被视为一个容器,就像文件夹一样,可以在其中包含其他文件。这些附加文件包含两种类型:序列化文件和资源文件。序列化文件包含分解为各个对象并写入此单个文件的资源。资源文件只是为某些资源(纹理和音频)单独存储的二进制数据块,允许我们有效地在另一个线程上从磁盘加载它们。
其次是通过代码进行交互以便从特定存档加载资源的实际 AssetBundle 对象。此对象包含一个映射,即从已添加到此存档的资源的所有文件路径到按需加载的资源所包含的对象之间的映射。
AssetBundle 可用于可下载内容(DLC),减小初始安装大小,加载针对最终用户平台优化的资源,以及减轻运行时内存压力。
AssetBundle打包的代码实现
- 大概了解了AssetBundle后,让我们来看一看如何进行打包。
首先要在项目的Asset文件夹中建立一个名为Editor的文件夹(如已经存在则不需要创建),并将包含以下内容的脚本放在该文件夹中:
[MenuItem("AssetBundle/Package (Default)")]
private static void PackageBuddle()//函数名可自定义
{
Debug.Log("Packaging AssetBundle...");//打印打包中提示信息
string packagePath = UnityEditor.EditorUtility.OpenFolderPanel("Select Package Path", "E:/AssetBundle", "");//默认打包输出路径
if (packagePath.Length <= 0 || !Directory.Exists(packagePath))
return;//所选路径有问题
Debug.Log("Output Path: " + packagePath);//打印所选打包输出路径信息
BuildPipeline.BuildAssetBundles(packagePath, BuildAssetBundleOptions.None, BuildTarget.NoTarget);//打包
AssetDatabase.Refresh();
}
代码解释:
- [MenuItem(“AssetBundle/Package (Default)”)]为Unity编辑器的扩展用法,会在Unity编辑器的菜单栏中新增AssetBundle项并加入Package (Default)子项,如果AssetBundle无子项则不会创建该选项。
- UnityEditor.EditorUtility.OpenFolderPanel回在执行到此方法时打开资源管理器面板,此处用于选择打包输出路径并设置默认打开路径为“E:/AssetBundle"。
- 使用BuildAssetBundles方法进行打包,其中第一个参数为打包输出路径,第二个参数为打包选项,第三个参数为目标平台,此处使用默认无平台。
更多BuildAssetBundleOptions
- 详细信息查看:Unity3D官方中文文档
变量 | 解释 |
None | 不使用任何特殊选项构建 assetBundle。 |
UncompressedAssetBundle | 创建资源包时不压缩数据。 |
DisableWriteTypeTree | 不包括 AssetBundle 中的类型信息。 |
DeterministicAssetBundle | 使用存储在资源包中对象的 ID 的哈希构建资源包。 |
ForceRebuildAssetBundle | 强制重新构建 assetBundle。 |
IgnoreTypeTreeChanges | 在执行增量构建检查时忽略类型树更改。 |
AppendHashToAssetBundleName | 向 assetBundle 名称附加哈希。 |
ChunkBasedCompression | 创建 AssetBundle 时使用基于语块的 LZ4 压缩。 |
StrictMode | 如果在此期间报告任何错误,则构建无法成功。 |
DryRunBuild | 进行干运行构建。 |
DisableLoadAssetByFileName | 禁用按照文件名称查找资源包 LoadAsset。 |
DisableLoadAssetByFileNameWithExtension | 禁用按照带扩展名的文件名称查找资源包 LoadAsset。 |
更多BuildTarget
- 详细信息查看:Unity3D官方中文文档
变量 | 解释 |
StandaloneOSX | 构建一个 macOS 独立平台(Intel 64 位) |
StandaloneWindows | 构建一个 Windows 独立平台 |
iOS | 构建一个 iOS 播放器 |
Android | 构建 Android .apk 独立平台应用程序 |
StandaloneLinux | 构建一个 Linux 独立平台 |
StandaloneWindows64 | 构建一个 Windows 64 位独立平台 |
WebGL | WebGL |
WSAPlayer | 构建一个 Windows 应用商店应用程序播放器 |
StandaloneLinux64 | 构建一个 Linux 64 位独立平台 |
StandaloneLinuxUniversal | 构建一个 Linux 通用独立平台 |
PS4 | 构建一个 PS4 独立平。 |
XboxOne | 构建一个 Xbox One 独立平台 |
tvOS | 构建到 Apple 的 tvOS 平台 |
Switch | 构建一个 Nintendo Switch 播放器 |
打包方法
- 在编辑器中对需要进行打包的资源在Inspector面板设置Asset Label,左侧为打包后的文件名,右侧为文件后缀尽量避免使用常见文件后缀,如mp3,mp4,avi等,避免加载时出现意外错误
- 下拉菜单中的New选项为创建新的文件名,Remove UnusedNames为删除未使用的文件名后缀名下拉菜单同样,None选项代表该资源不会被打包。
- 在代码部分准备完成后,回到Unity编辑器,在菜单栏中依次点击AssetBundle => Package (Default) 在代码中定义的名称,如果没有请仔细对照代码,然后选择目标输出路径后点击确定,等待编辑器进度条进行完