Unity 6.3
0 онлайн 38 гостей 3 в системе
Вход

BuildPipeline.BuildAssetBundles

Declaration

public static AssetBundleManifest BuildAssetBundles(BuildAssetBundlesParameters buildParameters);

Параметры

Параметр Описание
buildParameters Настройка сборки.

Возвращаемое значение

AssetBundleManifest Манифест, обобщающий все AssetBundles, созданные сборкой.

Описание

Создает AssetBundles в вашем проекте.

Эта подпись BuildAssetBundles рекомендуется и раскрывает наибольшую функциональность. Другие подписи, документированные ниже, сохранены для обратной совместимости и удобства.

Во время процесса сборки AssetBundle, классы, которые реализуют IProcessSceneWithReport вызываются по мере обработки сцен. Аналогичным образом, на способ сборки шейдеров можно повлиять путем реализации IPreprocessShaders или IPreprocessComputeShaders.

Этот метод возвращает экземпляр AssetBundleManifest, который описывает созданный AssetBundles.

Если сборка не удаётся, то этот метод возвращает null или вызывает исключение. Вы можете найти подробности о том, что пошло не так в сообщении об исключении или в ошибках, зарегистрированных в консоли.

Например, если вы передали неправильный или несуществующий путь в качестве параметра outputPath, метод возвращает ArgumentException, чтобы указать, что предоставленный аргумент был неправильным.

Указание targetPlatform, которая не является активной платформой, приводит к переключению Unity на новую платформу и повторному импорту ресурсов. Это может вызвать проблемы при создании сборки в пакетном режиме. Чтобы избежать этой проблемы, используйте аргумент командной строки -buildTarget для установки целевой платформы, а затем вызовите BuildAssetBundles.

Дополнительные ресурсы: AssetBundles, EditorBuildSettings.UseParallelAssetBundleBuilding

using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;
using UnityEditor;

public class BuildAssetBundlesExample { [MenuItem("Example/Build AssetBundles")] static void BuildBundles() { List<AssetBundleBuild> assetBundleDefinitionList = new();

// Define two asset bundles, populated based on file system structure

// The first bundle is all the scene files in the Scenes directory (non-recursive) { AssetBundleBuild ab = new(); ab.assetBundleName = "Scenes"; ab.assetNames = Directory.EnumerateFiles("Assets/" + ab.assetBundleName, "*.unity", SearchOption.TopDirectoryOnly).ToArray(); assetBundleDefinitionList.Add(ab); }

// The second bundle is all the asset files found recursively in the Meshes directory { AssetBundleBuild ab = new(); ab.assetBundleName = "Meshes"; ab.assetNames = RecursiveGetAllAssetsInDirectory("Assets/" + ab.assetBundleName).ToArray(); assetBundleDefinitionList.Add(ab); }

string outputPath = "MyBuild"; // Subfolder of the current project

if (!Directory.Exists(outputPath)) Directory.CreateDirectory(outputPath);

// Assemble all the input needed to perform the build in this structure. // The project's current build settings will be used because target and subtarget fields are not filled in BuildAssetBundlesParameters buildInput = new() { outputPath = outputPath, options = BuildAssetBundleOptions.AssetBundleStripUnityVersion, bundleDefinitions = assetBundleDefinitionList.ToArray() }; AssetBundleManifest manifest = BuildPipeline.BuildAssetBundles(buildInput);

// Look at the results if (manifest != null) { foreach (var bundleName in manifest.GetAllAssetBundles()) { string projectRelativePath = buildInput.outputPath + "/" + bundleName; Debug.Log($"Size of AssetBundle {projectRelativePath} is {new FileInfo(projectRelativePath).Length}"); } } else { Debug.Log("Build failed, see Console and Editor log for details"); } }

static List<string> RecursiveGetAllAssetsInDirectory(string path) { List<string> assets = new(); foreach (var f in Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories)) if (Path.GetExtension(f) != ".meta" && Path.GetExtension(f) != ".cs" && // Scripts are not supported in AssetBundles Path.GetExtension(f) != ".unity") // Scenes cannot be mixed with other file types in a bundle assets.Add(f);

return assets; } }

Помимо этого AssetBundle файлов, сборка создаст несколько других файлов:

* В AssetBundleManifest хранится в небольшом AssetBundle имеющее то же имя, что и папка выхода, например "MyBundleFolder". Это тот же самый объект, который возвращается из BuildAssetBundles вызов, и серийная форма может быть полезна во время выполнения, например, для определения ожидаемых хэшей других AssetBundles.

* Основной ".manifest" файл, который является файлом текстового формата. Он имеет то же имя, что и папка выхода, но использует ".manifest" как его расширение (например: "MyBundleFolder.manifest"). Назначить путь к этому файлу манифеста BuildPlayerOptions.assetBundleManifestPath перед вызовом BuildPipeline.BuildPlayer чтобы убедиться, что любые типы, появляющиеся в AssetBundles не изъяты из строения. (См. Управляемый код стриппинг для получения дополнительной информации о стриптинге кода.)

* Существует также отдельный ".manifest" файл, написанный для каждого AssetBundle, на основе названия AssetBundle.

* Наконец, BuildReport для сборки записывается в "Library/LastBuild.buildreport".

using System.IO;
using UnityEngine;
using UnityEditor;

public class BuildAssetBundlesOutputFileExample { [MenuItem("Example/AssetBundle Output File Example")] static void BuildAndPrintOutputFiles() { var bundleDefinitions = new AssetBundleBuild[] { new AssetBundleBuild { assetBundleName = "mybundle", assetNames = new string[] { "Assets/Scenes/Scene1.unity" } } };

string buildOutputDirectory = "build"; Directory.CreateDirectory(buildOutputDirectory);

BuildAssetBundlesParameters buildInput = new() { outputPath = buildOutputDirectory, bundleDefinitions = bundleDefinitions };

AssetBundleManifest manifest = BuildPipeline.BuildAssetBundles(buildInput); if (manifest != null) { var outputFiles = Directory.EnumerateFiles(buildOutputDirectory, "*", SearchOption.TopDirectoryOnly);

//Expected output (on Windows): // Output of the build: // build\build // build\build.manifest // build\mybundle // build\mybundle.manifest Debug.Log("Output of the build:\n\t" + string.Join("\n\t", outputFiles)); } } }

Declaration

public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);

Параметры

Параметр Описание
outputPath Путь выхода для AssetBundles.
assetBundleOptions AssetBundle варианты строительства.
targetPlatform Выбранная целевая платформа сборки.

Возвращаемое значение

AssetBundleManifest Манифест, содержащий список всех AssetBundles, включенных в данную сборку.

Описание

Построить все AssetBundles.

Используйте эту функцию для построения AssetBundles на основе AssetBundle и Метки, которые вы настроили в Редакторе. (См. страницу Руководства о AssetBundles рабочий процесс для получения дополнительной информации.)

Набор outputPath в папку в папке проекта, где вы хотите сохранить построенные пакеты (например: "Assets/ MyBundleFolder "). Папка не создается автоматически, и функция просто терпит неудачу, если она уже не существует.

Используйте необязательную assetBundleOptions аргумент для указания параметров сборки пакета.

targetPlatform аргумент выбирает цель развертывания (Windows Автономный, Android, iOS, и так далее) для создания пакетов. AssetBundle совместим только с конкретной платформой, для которой он был создан, поэтому для использования ассетов на различных платформах необходимо создать различные сборки данного пакета.

В случае нового кода подпись BuildAssetBundles принятие BuildAssetBundlesParameters Для того, чтобы поведение этой подписи соответствовало поведению подписи, оставьте строку BuildAssetBundlesParameters.bundleDefinitions поле не назначено, так что используются назначения Редактора AssetBundle.

Дополнительные ресурсы EditorUserBuildSettings.activeBuildTarget, AssetDatabase.GetAssetPathsFromAssetBundle, AssetDatabase.GetImplicitAssetBundleName, AssetImporter.assetBundleName, AssetBundle

// Create an AssetBundle for Windows.
using UnityEngine;
using UnityEditor;
using System.IO;

public class BuildAssetBundlesExample { [MenuItem("Example/Build Asset Bundles")] static void BuildABs() { // Put the bundles in a folder called "ABs" within the Assets folder. string outputPath = "Assets/ABs"; Directory.CreateDirectory(outputPath); BuildPipeline.BuildAssetBundles(outputPath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); } }

Declaration

public static AssetBundleManifest BuildAssetBundles(string outputPath, AssetBundleBuild[] builds, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);

Параметры

Параметр Описание
outputPath Путь выхода для AssetBundles.
сборки AssetBundle карта здания.
assetBundleOptions AssetBundle варианты строительства.
targetPlatform Платформа целевой сборки.

Возвращаемое значение

AssetBundleManifest Манифест, содержащий список всех AssetBundles, включенных в данную сборку.

Описание

Построить AssetBundles с карты строительства.

Эта подпись BuildAssetBundles позволяет вам задавать имена и содержимое пакетов программно, используя "карту сборки", а не детали, заданные в редакторе. Карта представляет собой просто массив объектов AssetBundleBuild, каждый из которых содержит имя пакета и список имен файлов ассетов, которые будут добавлены в именованный пакет.

Для нового кода рекомендуется подпись BuildAssetBundles, принимающая структуру BuildAssetBundlesParameters вместо этой. При использовании этой подписи карта сборки назначается BuildAssetBundlesParameters.bundleDefinitions.

using UnityEngine;
using UnityEditor;
using System.IO;

public class BuildAssetBundlesBuildMapExample { [MenuItem("Example/Build AssetBundles with Build Map")] static void BuildMapABs() { // Create the array of bundle build details. AssetBundleBuild[] bundleDefinitions = new AssetBundleBuild[2];

bundleDefinitions[0].assetBundleName = "enemybundle"; bundleDefinitions[0].assetNames = new string[] { "Assets/Textures/char_enemy_alienShip.jpg", "Assets/Textures/char_enemy_alienShip-damaged.jpg" };

bundleDefinitions[1].assetBundleName = "herobundle"; bundleDefinitions[1].assetNames = new string[] { "Assets/char_hero_beanMan.prefab" };

string outputPath = "Assets/ABs"; Directory.CreateDirectory(outputPath); BuildPipeline.BuildAssetBundles(outputPath, bundleDefinitions, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); } }