版本:Unity 6 (6000.0)
语言:English
AssetBundles
准备用于 AssetBundles 的资产

AssetBundle 工作流程

要开始使用 AssetBundles,请按照以下步骤操作。有关工作流程中每个部分的更详细的信息,可以在本节文档的其他页面中找到。

注意:本节介绍如何使用内置的 BuildPipeline.BuildAssetBundles API 创建 AssetBundles。推荐使用更友好且更易用的方法是使用 Addressables 包。

将资产分配给 AssetBundles

要将给定资产分配给 AssetBundle,请按照以下步骤操作

  1. 从项目视图中选择要分配到捆绑包的资产。
  2. 检查对象在 检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。 更多信息
    参见 词汇表
    中的信息。
  3. 在检查器的底部,有一个部分用于分配 AssetBundles 和变体。使用左侧的下拉菜单分配 AssetBundle,使用右侧的下拉菜单分配变体。
  4. 单击左侧下拉菜单中的以显示当前已注册的 AssetBundle 名称。
  5. 单击新建以创建一个新的 AssetBundle
  6. 键入所需的 AssetBundle 名称。注意:AssetBundle 名称支持一种类型的文件夹结构,具体取决于您键入的内容。要添加子文件夹,请使用/分隔文件夹名称。例如,使用 AssetBundle 名称environment/forest来创建一个名为forest的捆绑包,该捆绑包位于environment子文件夹下
  7. 选择或创建 AssetBundle 名称后,您可以对右侧下拉菜单重复此过程以分配或创建变体名称(如果您需要)。构建 AssetBundles 时不需要变体名称

注意:在检查器中,您可以将 AssetBundle 分配到项目中的文件夹。默认情况下,该文件夹中的所有资产都分配给与该文件夹相同的 AssetBundle。但是,单个资产的 AssetBundle 分配优先于此。

要了解更多关于 AssetBundle 分配及其配套策略的信息,请参见有关 准备用于 AssetBundles 的资产 的文档。

构建 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。您还可以使用代码将资产分配给 AssetBundles,使用接受 AssetBundleBuild 结构数组的 BuildPipeline.BuildAssetBundles 的签名。如果您使用此技术,您传递的数据将优先,并且在检查器中进行的任何对 AssetBundles 的分配都将被忽略。如果您希望自定义脚本利用在检查器中进行的 AssetBundle 分配,则可以调用 AssetDatabase.GetAllAssetBundleNamesAssetDatabase.GetAssetPathsFromAssetBundle,然后使用该信息填充 AssetBundleBuild 数组。

下载和加载 AssetBundles 和资产

AssetBundles 可以通过多种方式进行分发

  • StreamingAssets 文件夹中找到文件并将它们包含在您的 Player 构建中。
  • 由 Web 服务托管(例如 Unity 的云内容交付),并使用 UnityWebRequestAssetBundle 下载。
  • 通过您自己的下载或安装代码进行分发。这种方法需要更多开发工作,但确实可以灵活地完全控制压缩、缓存、修补 和验证等方面,然后使用 Unity API 加载文件。

根据文件的分布方式,您应该使用 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 的文档。

AssetBundles
准备用于 AssetBundles 的资产