Version: 5.3 (switch to 5.4b)
Multi Scene Editing
Plugins

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

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

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

Asset Bundles

Ассет бандл (Asset Bundle) - это внешняя коллекция ассетов. Вы можете иметь множество ассет бандлов и следовательно множество внешних коллекций ассетов. Эти файлы существуют вне проигрывателя, созданного Unity, обычно размещаются на вэб-сервере для динамического доступа.

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

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

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

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

Если вы собираете под Streaming Web Player (Web Player с функцией поточной загрузки), вы можете указать в какой сцене будет всё из ваших папок ресурсов. Сделать это можно в настройках проигрывателя (Player Settings), доступных через меню Edit->Project Settings->Player. Очередь поточной загрузки уровней определяется очередью сцен в окне Build Settings.

Важно:

Все ассеты из папок ресурсов и их зависимости хранятся в файле под названием resources.assets. Если ассет уже используется в другом уровне, он хранится в файле .sharedAssets для того уровня. Настройка Edit -> PlayerSettings First Streamed Level определяет уровень, в котором будет собран файл resources.assets для включения в сборку.

Если уровень до указанного в “First streamed Level” содержит ассет из папок ресурсов, ассет будет сохранён вместе с другими ассетами того уровня. Если же ассет из папок ресурсов содержит уровень после указанного в “First streamed Level”, уровень будет ссылаться на ассет из файла “resources.assets”.

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

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

Вы можете выгружать ресурсы ассет бандла вызывая AssetBundle.Unload(). Если вы передадите true в качестве аргумента unloadAllLoadedObjects, то и ассеты, хранящиеся в AssetBundle и ассеты, загруженные из AssetBundle с помощью AssetBundle.Load() будут уничтожены и будет освобождена память, которую они занимали.

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

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

Multi Scene Editing
Plugins