要开始使用 AssetBundles,请按照以下步骤操作。有关工作流程中每个部分的更详细的信息,可以在本节文档的其他页面中找到。
注意:本节介绍如何使用内置的 BuildPipeline.BuildAssetBundles API 创建 AssetBundles。推荐使用更友好且更易用的方法是使用 Addressables 包。
要将给定资产分配给 AssetBundle,请按照以下步骤操作
/
分隔文件夹名称。例如,使用 AssetBundle 名称environment/forest
来创建一个名为forest
的捆绑包,该捆绑包位于environment
子文件夹下注意:在检查器中,您可以将 AssetBundle 分配到项目中的文件夹。默认情况下,该文件夹中的所有资产都分配给与该文件夹相同的 AssetBundle。但是,单个资产的 AssetBundle 分配优先于此。
要了解更多关于 AssetBundle 分配及其配套策略的信息,请参见有关 准备用于 AssetBundles 的资产 的文档。
在 Assets 文件夹中创建一个名为 Editor 的文件夹,并将包含以下内容的脚本放置在该文件夹中
using UnityEditor;
using System.IO;
public class CreateAssetBundles
{
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
string assetBundleDirectory = "Assets/AssetBundles";
if(!Directory.Exists(assetBundleDirectory))
Directory.CreateDirectory(assetBundleDirectory);
BuildPipeline.BuildAssetBundles(assetBundleDirectory,
BuildAssetBundleOptions.None,
BuildTarget.StandaloneWindows);
}
}
此脚本在 Assets 菜单的底部创建了一个名为Build AssetBundles的菜单项。当您单击Build AssetBundles时,将调用 BuildAllAssetBundles() 函数。构建将使用您标记有 AssetBundle 名称的所有资产填充 AssetBundles,并在assetBundleDirectory
定义的路径中生成 AssetBundles,此时将出现进度条。
让我们更详细地了解传递给 BuildPipeline.BuildAssetBundles 的参数
assetBundleDirectory:这是将输出 AssetBundles 的目录,例如当前 Unity 项目中的“Assets/AssetBundles”。该文件夹不需要位于 Assets 文件夹内,您可以将其更改为所需的任何输出目录。请注意,我们的脚本会在需要时创建该文件夹。
BuildAssetBundleOptions.None:这是构建选项参数的默认值。您可以使用此参数指定一个或多个标志来启用各种可选行为。例如,此参数控制 压缩一种存储数据的方法,可减少其所需的存储空间。参见 纹理压缩、动画压缩、音频压缩、构建压缩。
参见 词汇表 算法的选择,参见 AssetBundle 压缩。有关可用选项的完整列表,请参见 BuildAssetBundleOptions。
BuildTarget.StandaloneWindows:在这里,我们告诉构建管道我们将使用这些 AssetBundles 的目标平台。您可以在脚本 API 参考中找到 BuildTarget 的可用构建目标列表。或者,您可以调用EditorUserBuildSettings.activeBuildTarget
,而不是硬编码构建目标,这将返回在 构建配置文件 窗口中设置为活动状态的平台配置文件。
上面的示例介绍了如何使用检查器将资产分配给 AssetBundles。您还可以使用代码将资产分配给 AssetBundles,使用接受 AssetBundleBuild 结构数组的 BuildPipeline.BuildAssetBundles 的签名。如果您使用此技术,您传递的数据将优先,并且在检查器中进行的任何对 AssetBundles 的分配都将被忽略。如果您希望自定义脚本利用在检查器中进行的 AssetBundle 分配,则可以调用 AssetDatabase.GetAllAssetBundleNames 和 AssetDatabase.GetAssetPathsFromAssetBundle,然后使用该信息填充 AssetBundleBuild 数组。
AssetBundles 可以通过多种方式进行分发
根据文件的分布方式,您应该使用 AssetBundle.Load API 或 UnityWebRequestAssetBundle 来加载 AssetBundle,并在您的运行时代码中访问 AssetBundle 对象。
从 AssetBundle 对象中,您可以调用 LoadAsset 方法之一。例如,LoadAsset<T>(string)
,它接受您尝试加载的资产的类型T
和资产的名称(通常是其路径)。您可以像在 Unity 中使用任何对象一样使用返回的对象。例如,如果您加载预制件,则 LoadAsset 将返回预制件的根游戏对象,然后您可以通过调用Instantiate()
将其实例化到当前场景中。
您可以通过调用 AssetBundle.Unload(bool) 或 AssetBundle.UnloadAsync(bool) 来回收已加载的 AssetBundle 使用的内存。
有关加载和卸载 AssetBundles 的 API 的更多信息,请参见有关 原生使用 AssetBundles 的文档。