Version: 6000.3
语言: 中文
在运行时管理资产
直接参考资产管理

运行时资产管理简介

在项目中加载和管理资产的方式会影响应用程序的内存使用情况、加载时间和构建大小。Unity 提供了多种资产管理系统,每个系统都针对特定用例和项目规模而设计。具有固定内容大小的小型应用程序通常可以使用 Unity 的默认资产管理系统AssetBundlesAddressables 等系统为复杂的资产布局或需要从远程服务器流式传输资产的应用程序提供了更好的管理。

运行时资产管理对生成的影响

默认情况下,Unity 使用场景列表来确定要包含在构建中的场景和资产及其加载顺序。Unity 仅包含场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表
列表,未从这些场景中引用的未使用的场景和资源将从构建中排除。您还可以使用SceneManager应用程序接口以确定如何在项目中加载场景。

例外情况是,如果您在 Resources 文件夹中包含任何场景,或将它们标记为 Addressable,则 Unity 会以不同的方式处理场景。

为了确定要构建的内容,Unity 使用以下信息:

  • 场景列表中包含的场景。
  • 任何影响建筑的首选项
  • 直接引用的任何资产。
  • 如果您使用资源系统,Unity 会在Resources文件夹。
  • 如果您使用 AssetBundle,Unity 会包括分配给 AssetBundle 的任何资产和场景,以及来自这些资产或场景的任何直接引用。
  • 如果您使用 Addressables,Unity 会包含分配给 Addressable 组的任何资产和场景,以及来自这些资产或场景的任何直接引用。

运行时资产管理选项

选择正确的方法取决于目标平台、内容交付要求以及是否需要动态加载功能等因素。提供以下管理系统:

  • 直接引用:管理资产的默认方式。Unity 在加载之前将场景中引用的所有资产加载到内存中。
  • 资源系统:加载和卸载Resources文件夹,并使用Resources应用程序接口。
  • AssetBundle 系统:使用AssetBundle应用程序接口。然后,您可以远程存储 AssetBundle 并按需下载。
  • Addressables 包:构建在AssetBundleAPI,它自动执行了 AssetBundle 系统具有的许多手动流程,并提供了一个 Unity 编辑器界面。
  • ECS 内容管理系统:如果您在项目中使用 Entities 包,那么它就有自己的内容管理系统。

直接引用

直接引用资产管理是在 Unity 中运行时管理资产的默认方式。每当您通过检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。更多信息
请参阅术语表
窗口中,您可以创建对该资产的直接引用。构建应用程序时,Unity 会将所有引用的资产保存在与项目中的场景关联的单独文件中。

您可以将直接引用与ScriptableObject实例来有效管理大型资产集并减小构建大小。仅使用直接引用的一个好处是,Unity 仅包含项目在构建中直接引用的资产,因此您的应用程序不会加载不必要或重复的资产。

直接引用有一些限制,如下所示:

  • 当您的应用程序在目标设备上运行时,Unity 会在加载场景之前将整个资产文件加载到内存中。这种方法不是动态的,你只能加载或卸载场景,这可能会导致加载时间变慢,尤其是在内存较少的设备上。
  • 不能使用托管在内容分发网络 (CDN) 上的资产。
  • 无法进行增量内容更新,如果要进行更改,则需要重新生成和重新部署整个应用程序。

有关更多信息,请参阅直接引用资产管理

资源系统

资源系统提供了一种管理内存中资产的简单方法。要使用资源系统,请创建一个名为Resources并向其添加资产。在构建过程中,Unity 会在Resources文件夹,并将它们捆绑到包含元数据和索引信息的序列化文件中。然后,您可以使用Resources用于加载和卸载应用程序中的资产的 API。

资源系统具有以下限制:

  • 资产Resources文件夹始终包含在播放器构建中,即使它们没有被任何内容引用。这可能会导致构建尺寸较大。
  • 如果你需要对项目中的资产进行更改,则需要重新构建和重新部署整个应用程序,而资产包和可寻址对象允许你创建增量内容更新。
  • 它不支持从远程服务器传送内容。
  • 加载了Resources.Load保留在内存中,直到显式卸载Resources.UnloadUnusedAssets,它卸载了Resources,或者直到卸载使用它们的场景。
  • 如果您在Resources文件夹,则构建和启动应用程序可能需要很长时间。
  • 如果您的代码按字符串加载资产,但缺少该资产,则Resources.Load返回null并成为运行时错误,因此您需要手动跟踪需要哪些资产。

它是原型设计的理想系统,也适用于在整个应用程序生命周期内需要资产的小型项目。有关更多信息,请参阅使用资产包在运行时加载资产

AssetBundle 系统

使用AssetBundle系统将资产组织到称为AssetBundles的单独容器文件中。您可以将 AssetBundle 文件存储在项目文件中,也可以远程存储在云中。

AssetBundle应用程序接口通过允许您按需下载 AssetBundles,最大限度地减少对网络和系统资源的影响。您可以使用此按需行为向应用程序添加 DLC 和发布后内容更新。例如,您可以为游戏交付新内容,而无需用户下载游戏的新版本。 这AssetBundle然后,API 提供了一种从下载的捆绑包中加载和卸载资产的方法。

AssetBundle 系统具有以下限制:

  • 您只能在脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。更多信息
    请参阅术语表
    ,并且没有用于构建 AssetBundle 的编辑器界面。
  • AssetBundleAPI 不会跟踪资产依赖关系。例如,如果您想加载预制件一种资产类型,允许您存储包含组件和属性的游戏对象。预制件充当模板,您可以从中在场景中创建新的对象实例。更多信息
    请参阅术语表
    在加载预制件之前,你需要手动加载AssetBundle以及AssetBundle所依赖的任何AssetBundle。安全卸载AssetBundle通常需要编写一个引用计数系统。有关更多信息,请参阅处理AssetBundle之间的依赖关系
  • 你需要手动分配和释放内存,因此你可能会通过从其他代码所依赖的AssetBundle中卸载资产来造成内存泄漏或内容丢失。
  • AssetBundleAPI 不知道 AssetBundle 是托管在本地还是远程托管,因此您需要跟踪项目中所有 AssetBundle 的位置。

有关更多信息,请参阅AssetBundle简介

可寻址包

Addressables 包在 Unity 编辑器中提供了一个用户界面,用于管理和组织项目中的资产。它建立在AssetBundleAPI 并自动管理依赖项、资产位置和内存分配,否则您必须在 AssetBundle 系统中手动处理这些问题。Addressables 包旨在消除资源和资产包系统的限制,从而更轻松地按需管理资产。

将资产设为可寻址后,你可以在代码中按地址引用它,而不是按其文件名或 AssetBundle 位置引用它,这意味着你可以更改资产的位置,而无需重写任何代码。您还可以使用资产引用来动态加载和卸载资产,这样您就不必始终将场景中的所有资产保留在内存中。

Addressables 系统专为将资产存储在 CDN 上的应用程序以及可能随着时间的推移进行内容更新的应用程序而设计。如果你的应用程序具有初始下载时附带的固定内容,那么使用直接引用或资源系统是可寻址对象或资产包的更好替代方案。

有关更多信息,请参阅可寻址对象概述

ECS内容管理系统

实体包有自己的内容管理系统,你可以在其中使用对资产的弱引用在运行时加载它们。您还可以创建内容存档以将内容交付到应用程序。更多信息,请参考内容管理简介

其他资源

在运行时管理资产
直接参考资产管理