Version: Unity 6.0 (6000.0)
语言 : 中文
Use the Resources system to load assets at runtime
Load and unload assets with the Resources system

在运行时加载资源

在某些情况下,为项目提供资源而不将资源作为场景的一部分进行加载是很有用的做法。例如,可能存在可出现在游戏的任何场景中但不经常使用的角色或其他对象(比如说,可能是“秘密”功能、错误消息或高分警报)。此外,甚至可能希望从单独的文件或 URL 加载资源,从而减少初始下载时间或支持可互换的游戏内容。

您可以在项目中使用__资源文件夹 (Resource Folders)__ 将内容包含在播放器构建中,这样这些内容在需要的时候可以随时加载,不受构建场景的限制。

资源文件夹

资源文件夹 (Resource Folders) 会包含一系列资源,即便构建的任何场景都没有直接引用这些资源,它们也会被包含在最终构建好的 Unity 播放器中。

若要将资源放入一个资源文件夹,需在__项目 (Project) 窗口__中新建一个文件夹,并将其命名为“Resources”。您可以在 Assets 文件夹下的不同子文件夹中创建多个资源文件夹 (Resource Folders),而且包里面可能也有 Resources 文件夹。接着,就可以像往项目 (Project) 窗口里其他普通文件夹放资源那样,把资源放进这些名为“Resources” 的文件夹。要是想从这些资源文件夹中加载某个资源,只需调用 Resources.Load() 即可。

注意:在 Resources 文件夹中找到的所有资源及其依赖项,都会存储在构建输出中一个名为 resources.assets 的文件里。如果构建中的某个场景引用资源,则该资源会被序列化到一个 sharedAssets*.assets 文件里。

通过 Resources.Load() 只能访问 Resources 文件夹_中的资源。然而,更多资源可能最终出现在 resources.assets_ 文件中,因为它们是依赖项。例如,Resources 文件夹中的材质可能引用 Resources 文件夹之外的纹理。在这种情况下,纹理也会包含在 resources.assets 文件中,但不能直接加载。

资源卸载

在加载新场景前,如果希望销毁之前通过 Resources.Load() 加载的场景对象,直接对这些对象调用 Object.Destroy() 即可。要释放资源并回收内存,则使用 Resources.UnloadUnusedAssets()

限制和替代方案

资源 (Resources) 系统用起来便捷,在快速搭建原型或开发小型项目时很实用。但它不太适用于大规模项目,不建议在整体开发中过度依赖。因此,建议使用 AssetBundle 和 Addressables 包。

使用资源系统的一些弊端缺点:

  • 往资源文件夹里存放大量内容,不仅会导致应用启动变慢,还会拉长构建时间。
  • Resource 文件夹不适合为特定平台提供自定义内容。
  • 对 Resource 文件夹中的资源进行更改需要播放器重新构建和重新部署,而 AssetBundle 更适合进行内容的增量更新。

资源文件夹适用于存放贯穿项目始终都需要、无需更新且不会因平台或设备而异的小资源。资源 (Resources) 文件夹中的资源可能作为游戏的最小化启动资源,而游戏的主要内容,会通过 AssetBundles 按需下载 。但是,位于 StreamingAssets 文件夹中的本地 AssetBundle 也能满足游戏最小启动的需求。

Use the Resources system to load assets at runtime
Load and unload assets with the Resources system