В версиях Unity до Unity 5 ресурсы нужно было выбирать и добавлять в пакеты с помощью скриптов редактора Фрагмент кода, который позволяет вам создавать свои собственные Компоненты, запускать игровые события, изменять свойства Компонентов с течением времени и реагировать на ввод данных пользователем любым удобным для вас способом. Подробнее
См. только в Словарь. (В Unity 5 мы предоставляем инструменты в редакторе для назначения ресурсов определенным пакетам). Эта информация предназначена для тех, кто работает над устаревшими проектами в Unity 4, и говорит о том, что вы используете Unity 4.
Чтобы создать пакет активов, вам нужно использовать класс редактора BuildPipeline. Все сценарии, использующие классы Editor, должны быть помещены в папку с именем Editor в любом месте папки Assets. Вот пример такого скрипта на C#:
// Legacy Unity 4 example. Not for use in Unity 5 & onwards
using UnityEngine;
using UnityEditor;
public class ExportAssetBundles {
[MenuItem("Assets/Build AssetBundle")]
static void ExportResource () {
string path = "Assets/myAssetBundle.unity3d";
Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path,
BuildAssetBundleOptions.CollectDependencies
| BuildAssetBundleOptions.CompleteAssets);
}
}
Сценарий редактора не нужно применять к GameObjectфундаментальному объекту в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. в Словарь, он используется редактором. В этом предыдущем примере будет создан новый элемент в меню «Активы» вашего редактора под названием «Сборка AssetBundle».
Чтобы использовать этот пример:
- Создайте файл сценария C# с именем ExportAssetBundles.cs в папке с именем Editor в представлении проекта.
- Выберите объект или ресурсы в папке вашего проекта, которые вы хотите превратить в AssetBundle.
- Выберите «Сборка AssetBundle» в меню «Активы». Нажмите «Сохранить», чтобы создать AssetBundle.
- Первая строка функции ExportResource задает путь к вашему AssetBundle.
- В следующей строке задается выбор, который будет сделан в AssetBundle как объекты, выбранные в окне проектаокне, которое показывает содержимое папки
Активы
(вкладка "Проект") Подробнее
См. в Словарь.
Функция BuildAssetBundle — это строка, которая создает AssetBundle и сохраняет его в указанном месте. Первый параметр указывает mainAsset, который является специальным Asset, который можно получить непосредственно с помощью свойства mainAsset при загрузке Assets из AssetBundle. Не обязательно устанавливать основной актив, если он не будет использоваться, вы можете использовать значение null для параметра. Второй параметр — это массив объектов, которые составят AssetBundle. Третий параметр — это место на диске, в котором будет сохранен AssetBundle. Последними параметрами являются флаги сборки или параметры, используемые при сборке AssetBundles. Эти BuildAssetBundleOptions можно комбинировать с помощью побитового оператора ИЛИ.
Сборка AssetBundles должна быть этапом перед публикацией, который происходит только один раз и с одним вызовом функции, например с элементом меню, который создает все AssetBundles. При разработке приложения вы должны написать вспомогательные сценарии, которые могут собрать все ваши пакеты AssetBundles для целевой платформы одним щелчком мыши или в пакетном режиме без вмешательства пользователя.
Существует три метода класса, которые можно использовать для создания AssetBundles:
BuildPipeline.BuildAssetBundle позволяет создавать пакеты AssetBundle из ресурсов любого типа.
BuildPipeline.BuildStreamedSceneAssetBundle используется, когда вы хотите включить только сценыСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь для потоковой передачи и загрузки по мере поступления данныхBuildPipeline.BuildAssetBundleExplicitAssetNames — это то же самое, что и BuildPipeline.BuildAssetBundle, но с дополнительным параметром для указания пользовательского строкового идентификатора (имени) для каждого объекта.
Пример сборки AssetBundle
Создание пакетов ресурсов выполняется с помощью сценариев редактора. Базовый пример этого есть в документации по сценариям для BuildPipeline.BuildAssetBundle.
Для этого примера скопируйте и вставьте сценарий по приведенной выше ссылке в новый сценарий C# с именем ExportAssetBundles. Этот скрипт следует поместить в папку с именем Editor, чтобы он работал внутри редактора Unity.
Теперь в разделе Активылюбые носители или данные, которые можно использовать в вашей игре или проекте. Ресурс может быть получен из файла, созданного вне Unity, например, из 3D-модели, аудиофайла или изображения. Вы также можете создавать некоторые типы ресурсов в Unity, например контроллер аниматора, аудиомикшер или текстуру рендеринга. Подробнее
В меню Словарь вы должны увидеть две новые опции меню.
Сборка AssetBundle из выбранного — отслеживание зависимостей. При этом текущий объект будет объединен в пакет ресурсов и будет включать все его зависимостиВ контексте диспетчера пакетов зависимость конкретная версия пакета (выраженная в форме
имя_пакета@версия_пакета
), которая требуется проекту или другому пакету для работы. Проекты и пакеты используют атрибут dependencies в своих манифестах для определения набора требуемых пакетов. Для проектов это считается прямой зависимостью; для пакетов это косвенные или транзитивные зависимости. Подробнее
См. в Словарь. Например, если у вас есть префабтип актива, который позволяет хранить GameObject вместе с компонентами и свойствами. Префаб действует как шаблон, из которого вы можете создавать новые экземпляры объектов на сцене. Подробнее
Посмотрите в Словарь, который состоит из нескольких иерархических слоев, тогда он рекурсивно добавит все дочерние объекты и компоненты в набор ресурсов.Сборка AssetBundle из выбранного — без отслеживания зависимостей. Этот метод противоположен предыдущему и будет включать только один выбранный вами объект.
Для этого примера необходимо создать новый префаб. Сначала создайте новый куб, выбрав GameObject > 3D Object > Cube, что создаст новый куб в представлении Hierarchy. Затем перетащите куб из представления иерархии в представление проекта, в результате чего будет создан префаб этого объекта.
Затем следует щелкнуть правой кнопкой мыши префаб Cube в окне проекта и выбрать Build AssetBundle From Selection — Track dependencies. На этом этапе вам будет представлено окно для сохранения «связанного» актива. Если вы создали новую папку под названием «AssetBundles» и сохранили куб как Cube.unity3d, окно вашего проекта теперь будет выглядеть примерно так.
На этом этапе вы можете переместить AssetBundle Cube.unity3d в другое место вашего локального хранилища или загрузить его на сервер по вашему выбору.
Пример изменения свойств ресурсов при создании пакета ресурсов
Вы можете использовать AssetDatabase.ImportAsset, чтобы принудительно повторно импортировать актив прямо перед вызовом BuildPipeline.BuildAssetBundle, а затем используйте AssetPostprocessor.OnPreprocessTexture, чтобы установить необходимые свойства. В следующем примере показано, как задать различные сжатие текстурыМетод хранения данных, который уменьшает объем требуемого места для хранения. См. Сжатие текстур, Сжатие анимации, Сжатие звука, Сжатие компоновки.
См. Словарь при создании пакета активов.
// Legacy Unity 4 example. Not for use in Unity 5 & onwards.
// Builds an asset bundle from the selected objects in the project view,
// and changes the texture format using an AssetPostprocessor.
using UnityEngine;
using UnityEditor;
public class ExportAssetBundles {
// Store current texture format for the TextureProcessor.
public static TextureImporterFormat textureFormat;
[MenuItem("Assets/Build AssetBundle From Selection - PVRTC_RGB2")]
static void ExportResourceRGB2 () {
textureFormat = TextureImporterFormat.PVRTC_RGB2;
ExportResource();
}
[MenuItem("Assets/Build AssetBundle From Selection - PVRTC_RGB4")]
static void ExportResourceRGB4 () {
textureFormat = TextureImporterFormat.PVRTC_RGB4;
ExportResource();
}
static void ExportResource () {
// Bring up save panel.
string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d");
if (path.Length != 0) {
// Build the resource file from the active selection.
Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
foreach (object asset in selection) {
string assetPath = AssetDatabase.GetAssetPath((UnityEngine.Object) asset);
if (asset is Texture2D) {
// Force reimport thru TextureProcessor.
AssetDatabase.ImportAsset(assetPath);
}
}
BuildPipeline.BuildAssetBundle(Selection.activeObject,
selection,
path,
BuildAssetBundleOptions.CollectDependencies |
BuildAssetBundleOptions.CompleteAssets);
Selection.objects = selection;
}
}
}
// Legacy Unity 4 example. Not for use in Unity 5 & onwards.
// Changes the texture format when building the Asset Bundle.
using UnityEngine;
using UnityEditor;
public class TextureProcessor : AssetPostprocessor
{
void OnPreprocessTexture() {
TextureImporter importer = assetImporter as TextureImporter;
importer.textureFormat = ExportAssetBundles.textureFormat;
}
}
Вы также можете управлять импортом ресурса с помощью AssetDatabase.ImportAssetOptions.
В тестовой среде иногда необходимо протестировать изменение, требующее пересборки AssetBundles. В этих случаях рекомендуется использовать параметр BuildAssetBundleOptions.UncompressedAssetBundle при сборке пакетов AssetBundle. Это ускорит сборку и загрузку пакетов AssetBundles, но они также будут больше и, следовательно, будут загружаться дольше.
Создание AssetBundles в производственной среде
При первом использовании AssetBundles может показаться достаточным создать их вручную, как показано в предыдущем примере. Но по мере роста проекта и увеличения количества активов выполнять этот процесс вручную неэффективно. Лучшим подходом является написание функции, которая создает все AssetBundles для проекта. Например, вы можете использовать текстовый файл, который сопоставляет файлы Asset с файлами AssetBundle.