包含此页的版本:
不含此页的版本:
创建 AssetBundle 时,需要注意一些限制和组织策略。
您可以通过以下方式组织资产:
您可以在项目中混合使用这些策略,以获得应用程序的最佳效率。例如,您可以将不同平台的UI元素分组到一个AssetBundle中,但按级别或场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表.
你可以将哪些资产放入AssetBundle中,以及如何设置它们,有一些限制。下表包含 AssetBundle 的限制:
| 限度 | 描述 |
|---|---|
| 文件类型 |
|
| 命名 | AssetBundle的名称必须与输出文件夹不同。 |
| 平台支持 | AssetBundle 只能加载到你为其构建它们的特定平台上。编辑器可以加载任何AssetBundle,而不管构建配置文件 为目标平台创建构建时使用的一组可自定义配置设置。更多信息 请参阅术语表,但如果某些资产使用安装编辑器的作系统不支持的特定于平台的格式,则可能无法正确加载。 |
无论采用哪种组织方法,最佳做法都是遵循以下一般准则:
您可以使用 AssetBundle 变体创建针对不同情况或配置(例如不同的图形设置)进行优化的 AssetBundle 的多个版本。例如,您可以为低分辨率、中分辨率和高分辨率纹理创建变体,以支持具有不同性能或用户选择的图形设置的设备。
使用 AssetBundle 变体时,Unity 允许您为每个 AssetBundle 指定变体名称。AssetBundle 名称和变体名称的组合唯一标识每个 AssetBundle 变体。例如,名为environment可能有名为lowQuality,mediumQuality和highQuality.
AssetBundles 中的资产文件名必须匹配,但内容可能会因变体的用途而异。
您可以在检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。更多信息
请参阅术语表,使用AssetBundle旁边的变体下拉菜单,或使用AssetImporter.assetBundleVariant.
在以下情况下,根据资产的功能协同工作方式来组织资产很有用:
这种方法非常适合可下载内容 (DLC),因为您可以对项目进行小的更改,而无需向用户分发大量未更改的资产。但是,使用此方法时,您必须熟悉每个资产在项目中的使用位置和时间。
你可以将类似类型的资产(如音轨或语言本地化文件)组织到单个资产包中,这在很少更改的资产包中非常有用。
以这种方式对资产包进行分组可以减少在创建增量构建时更改和需要分发的资产包。但是,可能需要下载和加载更多 AssetBundle,以便在运行时将所有依赖对象组合在一起。
您可以将 Unity 同时加载和使用的资产组合在一起,如果您想根据场景加载 AssetBundle,这非常有用。例如,您可以将此方法用于基于关卡的游戏,其中每个关卡都包含唯一的资产,并且 AssetBundle 包含场景的所有依赖项。
但是,这种方法意味着一个 AssetBundle 中的资产只能在使用其余资产的同时使用,否则会增加加载时间。
重要包含场景的 AssetBundle 会自动包含该场景中引用的所有资产,除非它们被显式分配给单独的 AssetBundle。如果任何其他场景使用其他资产包中的引用资产,这可能会导致资产重复。
Unity 使用资产数据库来发现对象内置到 AssetBundle 中的所有依赖项。Unity 使用此依赖关系信息来确定要包含在 AssetBundle 中的对象集。
AssetBundle 分配发生在资产级别。资产中显式分配给 AssetBundle 的对象仅包含在该特定 AssetBundle 中。根据BuildPipeline.BuildAssetBundles方法,则通过设置其AssetImporter.assetBundleName属性设置为非空字符串,或将其列在AssetBundleBuild.assetNames.
任何属于资产的一部分,如果这些对象不是在资产包中显式分配的,则会包含在包含引用该资产的任何对象的每个资产包中。
例如,如果两个对象被分配给单独的 AssetBundle,但共享对同一依赖对象的引用,则 Unity 会将依赖对象复制到两个 AssetBundle 中。这些重复的依赖项也会被实例化,这意味着这两个副本被视为具有唯一标识符的不同对象。这会增加应用程序 AssetBundle 的总体大小,并且如果加载了两个父 AssetBundle,则会导致将对象的两个单独副本加载到内存中。
您可以使用以下方法来避免资产重复:
AssetBundle.LoadAsset蜜蜂属。对象依赖关系通过AssetDatabaseAPI,在UnityEditorNamespace。 此 API 仅在 Unity 编辑器中可用,在运行时不可用。 用AssetDatabase.GetDependencies获取特定对象或资产的直接依赖关系。依赖关系可能有自己的依赖关系,因此这可以是递归计算。
可以通过传递AssetBundleBuildstructures 设置为BuildPipeline.BuildAssetBundles,或通过使用AssetImporter应用程序接口。 你还可以创建一个编辑器脚本,以确保所有直接或间接依赖关系当项目请求一个包本身“依赖”另一个包时,就会出现间接或传递依赖关系。例如,如果您的项目依赖于alembic@1.0.7包,而包又取决于timeline@1.0.0package,则您的项目直接依赖于 Alembic,间接依赖于 Timeline。更多信息
请参阅术语表的 AssetBundle 分配给 AssetBundle,或者验证没有两个 AssetBundle 共享尚未显式分配的依赖项。
注意:如果您使用 Addressables 包,则可以使用 Addressables 分析工具来发现重复的资产。