Version: 6000.3
语言: 中文
将资产组织到资产包中
AssetBundle 压缩格式

将资产构建到 AssetBundle 中

要将资产构建到 AssetBundle 中,您必须在 Unity 编辑器中或通过脚本将资产分配给 AssetBundle。然后,您可以创建并使用脚本来构建资产包。有关将资产组织到资产包中的最佳方法的信息,请参阅为资产包准备资产

注意:此工作流程描述了如何使用内置的BuildPipeline.BuildAssetBundles应用程序接口。一个更用户友好的替代方案是使用 Addressables 包。

在编辑器中将资产分配给AssetBundle

要在 Unity 编辑器中将给定资产分配给 AssetBundle,请执行以下步骤:

  1. 项目窗口一个窗口,显示您的内容Assets文件夹(项目选项卡)更多信息
    术语表中查看
    并在检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。更多信息
    请参阅术语表
    .
  2. 使用 Inspector 窗口底部的 AssetBundle 左侧下拉菜单来分配或创建 AssetBundle:
    • 要创建新的AssetBundle,请选择左侧下拉菜单并选择 新建(New),或从列表中选择现有的AssetBundle。提示:要使用子文件夹组织AssetBundle,请使用字符。例如,使用 AssetBundle 名称/environment/forest创建名为forestenvironment子文件夹。
  3. (可选)使用右侧菜单分配或创建 AssetBundle 变体
    • 要创建新变体,请选择右侧下拉菜单并选择新建,或从列表中选择现有变体。

将多个资产分配给 AssetBundle

你可以将 AssetBundle 分配给项目中的文件夹。默认情况下,该文件夹中的所有资产都分配给与该文件夹相同的 AssetBundle。但是,单个资产的 AssetBundle 分配优先。要将 AssetBundle 分配给文件夹,请执行以下作:

  1. 在其包含的父文件夹中的“项目”窗口中选择该文件夹。
  2. 使用 AssetBundle 下拉菜单将新的或现有的 AssetBundle 分配给文件夹。

你还可以选择多个资产,并将它们分配给资产包。但是,以这种方式将资产分配给资产包会覆盖这些资产的任何现有资产包分配。

使用脚本将资产分配给 AssetBundle

要将资产分配给代码中的 AssetBundle,请使用BuildPipeline.BuildAssetBundles方法,数组为AssetBundleBuild结构。此方法会覆盖在 Inspector 中进行的任何 AssetBundle 分配。

如果您希望脚本遵循在 Inspector 中进行的 AssetBundle 分配,请使用AssetDatabase.GetAllAssetBundleNamesAssetDatabase.GetAssetPathsFromAssetBundle检索必要的信息并填充AssetBundleBuild数组。

构建资产包

要构建 AssetBundle,您必须创建一个构建脚本并将其放置在名为EditorAssets文件夹。

以下脚本是 AssetBundle 构建脚本的示例。它在 资产(Assets) 菜单底部添加了一个名为 构建资产包(Build AssetBundles) 的菜单项。选择 构建资产包(Build AssetBundles) 时,BuildAllAssetBundles方法被调用。当构建获取你用 AssetBundle 名称标记的所有资产时,会出现一个进度条,并使用它们在路径上填充 AssetBundleassetBundleDirectory定义。

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);
    }
}

该脚本具有以下参数:

  • assetBundleDirectory:在当前 Unity 项目中将 AssetBundle 输出到的目录。该文件夹不需要位于Assets文件夹。在代码示例中,如果文件夹不存在,它会按需创建文件夹。
  • BuildAssetBundleOptions.None:构建选项参数的默认值。您可以使用此参数指定一个或多个标志以启用各种可选行为。例如,此参数控制压缩算法的选择。有关可用选项的完整列表,请参阅BuildAssetBundleOptionsAPI 文档.
  • BuildTarget.StandaloneWindows:定义 AssetBundle 的目标平台。或者,您可以调用EditorUserBuildSettings.activeBuildTarget,返回当前在构建配置文件目标平台创建构建时使用的一组可自定义配置设置。更多信息
    请参阅术语表
    窗。

执行干净的构建

您应该在发布正式的 AssetBundle 时执行干净的构建。要执行干净的构建,请将BuildAssetBundleOptions.ForceRebuildAssetBundleflag 作为选项BuildPipeline.BuildAssetBundles.

在某些项目中,您可以删除Library/ShaderCache目录,以减少下一个播放器或资产包构建所需的时间,特别是对于着色器在 GPU 上运行的程序。更多信息
请参阅术语表
编译是一个漫长的过程。指定BuildAssetBundleOptions.ForceRebuildAssetBundle.

执行干净构建的另一种方法是停止 Unity,删除项目的Library目录,然后重新打开 Unity。此过程非常耗时,因为需要重新导入所有项目资产并重新生成其他数据。

有关更多信息,请参阅增量构建管道

更改目标平台

BuildPipeline.BuildAssetBundlesAPI 允许您指定用于部署 AssetBundle 的目标和子目标平台。

如果指定的目标平台与 Build Profiles 中配置的平台不同,则 Unity 必须重新编译编辑器脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。更多信息
请参阅术语表
并重新导入具有特定于平台的表示的纹理等资源。构建完成后,Unity 会恢复原始目标平台设置。

此过程会显着增加构建时间。此外,包含BuildPipeline.BuildAssetBundles调用继续执行,为当前目标平台编译,而不是指定的生成目标。如果生成脚本或回调脚本依赖于特定于平台的代码或程序集,则可能会导致问题。

为避免此问题,请确保在构建期间执行的任何代码都会动态检查目标平台(例如,使用if语句),而不是依赖于特定于平台的条件编译(例如#ifdef语句)。

对于命令行构建,请使用--buildTarget 命令行参数,使目标平台与您的构建要求保持一致。

下载并加载 AssetBundle 和资源

您可以通过以下方式分发 AssetBundle:

要加载 AssetBundle 并访问运行时代码中的 AssetBundle 对象,请使用AssetBundleUnityWebRequestAssetBundle.

要回收加载的 AssetBundle 使用的内存,请调用AssetBundle.Unload(bool)AssetBundle.UnloadAsync(bool).

有关加载和卸载AssetBundle的API的更多信息,请参阅从AssetBundle加载资产。

其他资源

将资产组织到资产包中
AssetBundle 压缩格式