Version: 2021.1
Scripting with Assets
Streaming Assets

Загрузка ресурсов в реальном времени

В некоторых случаях полезно создать ассет, доступный для проекта без его загрузки в качестве части сцены. Например, там может быть персонаж или другой объект, который может появиться в любом месте игры, но который будет использоваться лишь изредка (это может быть “секретная” функция, сообщение об ошибке или предупреждение о рекордном счете). Кроме того, вы даже можете загрузить ресурс из отдельного файла или через URL, чтобы сократить время начального скачивания или добавить в проект взаимозаменяемый контент.

Unity поддерживает папки ресурсов в проекте (папки с названием Resources), чтобы разработчик мог добавить в сборку контент, который не будет загружен до того как понадобится. В Unity Pro, Unity iOS Advanced и Unity Android Advanced вы также можете создавать ассет бандлы. Это файлы, полностью отделённые от главной игры, которые содержат ассеты, к которым игра может получить доступ при необходимости, из файла или по URL.

Asset Bundles

An Asset Bundle is an external collection of assets. You can have many Asset Bundles and therefore many different external collections of assets. These files exist outside of the built Unity player, usually sitting on a web server for end-users to access dynamically.

Чтобы собрать ассет бандл, вы вызываете BuildPipeline.BuildAssetBundle() из Editor скрипта. В аргументах вы указываете массив __объектов __ для включения в бандл, и некоторые другие опции. Этот метод соберёт файл, который вы потом сможете динамически загружать в реальном времени с помощью AssetBundle.Load().

Папки ресурсов

Папки ресурсов содержат коллекции ассетов, которые включаются в проигрыватель, создаваемый Unity, но не обязательно связаны с каким-либо GameObject’ом в инспекторе.

Чтобы что-либо положить в папку ресурсов, достаточно просто создать в окне Project (Project View) новую папку с именем “Resources”. У вас может быть несколько папок ресурсов, размещённых в разных подпапках проекта. Когда вы пожелаете загрузить ассет из любой такой папки, вызовите метод Resources.Load().

Важно:

All assets found in the Resources folders and their dependencies are stored in a file called resources.assets. If an asset is already used by another level it is stored in the .sharedAssets file for that level. The Edit -> PlayerSettings First Streamed Level setting determines the level at which the resources.assets will be collected and included in the build.

If a level prior to “First streamed Level” is including an asset in a Resource folder, the asset will be stored in assets for that level. If it is included afterwards, the level will reference the asset from the “resources.assets” file.

Только ассеты из папки Resources могут быть загружены с помощью Resources.Load. Однако, многие другие ассеты могут оказаться в файле “resources.assets”, если они являются зависимостями ассетов из папок ресурсов (например, материал в папке Resources может ссылаться на текстуру вне этой папки).

Выгрузка ресурсов

You can unload resources of an AssetBundle by calling AssetBundle.Unload() or AssetBundle.UnloadAsync(bool). If you pass true for the unloadAllLoadedObjects parameter, both the objects held internally by the AssetBundle and the ones loaded from the AssetBundle using AssetBundle.LoadAsset() will be destroyed and memory used by the bundle will be released.

Иногда предпочтительнее загрузить AssetBundle, создать экземпляры интересующих вас объектов и освободить память, занимаемую уже ненужным вам ассет бандлом, при этом сохранив загруженные объекты. Это полезно для освобождения памяти для других задач, например, для загрузки другого AssetBundle. В таком случае, вам следует передать false в качестве аргумента. После уничтожения бандла вы более не сможете загружать из него объекты.

Если вы желаете уничтожить объекты в сцене, загруженные с помощью Resources.Load() до загрузки другого уровня, вызовите на них Object.Destroy(). Чтобы выгрузить ассеты, используйте Resources.UnloadUnusedAssets().

Scripting with Assets
Streaming Assets