包含此页的版本:
不含此页的版本:
要将资产构建到 AssetBundle 中,您必须在 Unity 编辑器中或通过脚本将资产分配给 AssetBundle。然后,您可以创建并使用脚本来构建资产包。有关将资产组织到资产包中的最佳方法的信息,请参阅为资产包准备资产。
注意:此工作流程描述了如何使用内置的BuildPipeline.BuildAssetBundles应用程序接口。一个更用户友好的替代方案是使用 Addressables 包。
要在 Unity 编辑器中将给定资产分配给 AssetBundle,请执行以下步骤:
Assets文件夹(项目选项卡)更多信息/environment/forest创建名为forest在environment子文件夹。你可以将 AssetBundle 分配给项目中的文件夹。默认情况下,该文件夹中的所有资产都分配给与该文件夹相同的 AssetBundle。但是,单个资产的 AssetBundle 分配优先。要将 AssetBundle 分配给文件夹,请执行以下作:
你还可以选择多个资产,并将它们分配给资产包。但是,以这种方式将资产分配给资产包会覆盖这些资产的任何现有资产包分配。
要将资产分配给代码中的 AssetBundle,请使用BuildPipeline.BuildAssetBundles方法,数组为AssetBundleBuild结构。此方法会覆盖在 Inspector 中进行的任何 AssetBundle 分配。
如果您希望脚本遵循在 Inspector 中进行的 AssetBundle 分配,请使用AssetDatabase.GetAllAssetBundleNames和AssetDatabase.GetAssetPathsFromAssetBundle检索必要的信息并填充AssetBundleBuild数组。
要构建 AssetBundle,您必须创建一个构建脚本并将其放置在名为Editor在Assets文件夹。
以下脚本是 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:
UnityWebRequestAssetBundle下载它们。要加载 AssetBundle 并访问运行时代码中的 AssetBundle 对象,请使用AssetBundle或UnityWebRequestAssetBundle.
要回收加载的 AssetBundle 使用的内存,请调用AssetBundle.Unload(bool)或AssetBundle.UnloadAsync(bool).
有关加载和卸载AssetBundle的API的更多信息,请参阅从AssetBundle加载资产。