Ассет бандлы и адрессаблы. Для чего используются и есть ли опыт разработки с их использованием?

Роль Asset Bundle:

1. AssetBundle — это сжатый пакет, содержащий модели, текстуры, префабы, звуки и даже всю сцену, которую можно загрузить во время работы игры;

2. Сам AssetBundle поддерживает взаимные зависимости;

3. Сжатый пакет может использовать алгоритмы сжатия LZMA и LZ4 для уменьшения размера пакета и ускорения передачи по сети;

4. Поместите некоторый загружаемый контент в AssetBundle, что может уменьшить размер установочного пакета;

Что такое AssetBundle

Можно разделить на два пункта:
1. Это файл, существующий на жестком диске. Его можно назвать сжатым пакетом. Этот сжатый пакет можно рассматривать как папку, содержащую несколько файлов. Эти файлы можно разделить на две категории: сериализованные файлы и файлы ресурсов. (Сериализованные файлы и исходные файлы)
сериализованный файл: ресурс разбивается на объект и, наконец, записывается в один файл (только один).
файлы ресурсов: некоторые двоичные ресурсы (изображения, звуки) сохраняются отдельно для быстрой загрузки.
2. Это объект AssetBundle, который можно загрузить из конкретного сжатого пакета с помощью кода. Этот объект содержит все содержимое, которое мы добавили в сжатый пакет, и мы можем загрузить его и использовать через этот объект.

Пример упаковки ресурсов Asset Bundle

Простой инструмент для упаковки и менеджмента бандлов.
https://github.com/Unity-Technologies/AssetBundles-Browser
Unity Asset Bundle Browser tool оч просто и понятно

Независимо от того, являются ли это ресурсы модели или ресурсы пользовательского интерфейса, лучше всего сначала поместить их в Prefab, а затем превратить их в Assetbundle. Возьмем модель в качестве примера. Одна или несколько моделей могут быть помещены в Assetbundle. Он очень гибкий, поэтому самое важное, что нужно учитывать, — это занимаемое пространство модели.

Давайте возьмем реальную операцию. Сначала создайте два 3D-объекта, Cube и Capsule, и превратите их в Prefab, а затем перейдите к указанию свойства AssetBundle ресурса. Здесь я упакую эти две модели в пакет model.ab.
(xxxa / xxx) Здесь xxxa сгенерирует каталог с именем xxx, а следующий ab — суффиксное имя, которое можно настроить.

После настройки свойств начните сборку пакета AssetBundle. Сначала создайте папку с именем Editor. Эта папка является специальной папкой расширения редактора, которая не будет упакована. Затем мы создаем класс расширения редактора CreateAssetbundles. Напишите следующий код

using UnityEditor;using System.IO; public class CreateAssetbundles  {     [MenuItem("AssetsBundle/Build AssetBundles")]           static void BuildAllAssetBundles () // Упаковка    {        string dir = "AssetBundles";                 // Определяем, существует ли каталог        if (Directory.Exists(dir) == false)        {                         Directory.CreateDirectory (dir); // Создаем каталог AssetBundles в проекте        }                 // Первый параметр - это путь к пакету, второй параметр, параметр сжатия, третий параметр, цель платформы        BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);    }}

1. BuildAssetBundleOptions.None: используйте алгоритм LZMA для сжатия, сжатый пакет меньше, но время загрузки больше. Перед использованием его нужно полностью распаковать. После распаковки пакет будет повторно сжат с использованием LZ4. При использовании ресурсов нет необходимости полностью распаковывать. Вы можете использовать алгоритм LZMA при загрузке. После загрузки он будет сохранен локально с использованием алгоритма LZ4.
2. BuildAssetBundleOptions.UncompressedAssetBundle: без сжатия, большой пакет, быстрая загрузка.
3. BuildAssetBundleOptions.ChunkBasedCompression: при использовании сжатия LZ4 степень сжатия не такая высокая, как у LZMA, но мы можем загружать указанные ресурсы, не распаковывая их все.
Обратите внимание, что при использовании сжатия LZ4 вы можете получить скорость загрузки, сопоставимую с несжатыми файлами, и она меньше, чем несжатые файлы.

Затем вернитесь в Unity и нажмите кнопку пакета, которую мы только что расширили.

После щелчка наша модель упакована. Вы можете найти каталог AssetBundles в каталоге проекта. В AssetBundles есть папка Scene, которая содержит наши упакованные файлы с расширением .ab.

Загрузка AssetBundle

Есть несколько способов загрузить AssetBundle: LoadFromMemoryAsync используется для загрузки из памяти, LoadFromFile может использоваться для загрузки из локальных файлов, а UnityWbRequest может использоваться для загрузки из Интернета на сервер. Давайте посмотрим на эти способы загрузки.
Сначала удалите Prefab Cube и Capsule двух моделей в нашем Unity, затем создайте скрипт, который будет висеть на камере, и откройте скрипт.

Первый метод загрузки (LoadFromMemoryAsync) загружается из памяти
 

using UnityEngine;
using System.IO;
using System.Collections;
public class LoadFromFileExample : MonoBehaviour {
 
    IEnumerator  Start () {
        string path = "AssetBundles/scene/model.ab";
                 // Первый способ загрузки AB LoadFromMemoryAsync
                 // Асинхронная загрузка
        AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
        yield return request;
        AssetBundle ab = request.assetBundle;
                 // Синхронно
        //AssetBundle ab=  AssetBundle.LoadFromMemory(File.ReadAllBytes(path));
 
                   // Используем ресурсы внутри
                 Object [] obj = ab.LoadAllAssets <GameObject> (); // Загружаем и помещаем в массив
                 // Создано
        foreach (Object o in obj)
        {
            Instantiate(o);
        }
    }
}

Второй способ (LoadFromFile) загружается локально

using UnityEngine;
using System.Collections;
 
public class LoadFromFileExample : MonoBehaviour {
 
    IEnumerator  Start () {
        string path = "AssetBundles/scene/model.ab";
        // Второй метод загрузки LoadFromFile
                 // Асинхронная загрузка
        AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(path);
        yield return request;
        AssetBundle ab = request.assetBundle;
                 // Синхронная загрузка
        //AssetBundle ab = AssetBundle.LoadFromFile(path);
 
                 // Используем ресурсы внутри
             Object [] obj = ab.LoadAllAssets <GameObject> (); // Загружаем и помещаем в массив
                 // Создано
        foreach (Object o in obj)
        {
            Instantiate(o);
        }
     }
}

Третий метод (UnityWbRequest) загружается с сервера или локально

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class LoadFromFileExample: MonoBehaviour {

  IEnumerator Start() {
    // Третий способ загрузки - загрузка сервера UnityWbRequest с использованием локальной загрузки http с использованием файла
    //string uri = @"file:///C:\Users\Administrator\Desktop\AssetBundleProject\AssetBundles\model.ab";
    string uri = @ "http://localhost/AssetBundles\model.ab";
    UnityWebRequest request = UnityWebRequest.GetAssetBundle(uri);
    yield
    return request.Send();
    AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);

    // Используем ресурсы внутри
    Object[] obj = ab.LoadAllAssets < GameObject > (); // Загружаем и помещаем в массив
    // Создано
    foreach(Object o in obj) {
      Instantiate(o);
    }
  }
}

Таким образом, ресурсы в нашем пакете Model загружаются и создаются в сцене. В это время запустите Unity, и вы увидите, что две модели были созданы отдельно.

Конечно, вы также можете создавать указанные ресурсы, такие как

 AssetBundle ab=AssetBundle.LoadFromFile("AssetBundles/scene/model.ab");        GameObject go = ab.LoadAsset<GameObject>("Cube");       
 Instantiate(go)

Таким образом осуществляется загрузка ресурсов Asset Bundle.

Стратегия группировки AssetBundle

1. Поместите часто обновляемые ресурсы в отдельный пакет и отделите их от редко обновляемых пакетов.
2. Поместите ресурсы, которые необходимо загрузить одновременно, в пакет.
3. Вы можете поместить ресурсы, общие для других пакетов, в отдельный пакет.
4. Упакуйте несколько небольших ресурсов, которые необходимо загрузить одновременно, в пакет.
5. Если есть две версии одного и того же ресурса, рассмотрите возможность использования суффикса для различения v1 v2 v3 unity3dv1 unity3dv2

1. Группировка логических объектов
a, один интерфейс пользовательского интерфейса или один пакет для всех интерфейсов пользовательского интерфейса (один пакет для текстур и информации о макете в этом интерфейсе)
b, пакет для одного или всех персонажей (пакет для модели и анимации в этом персонаже)
c, пакет, общий для всех сцен (включая текстуры и модели)
2. Группировать по типу
Все звуковые ресурсы упакованы в один пакет, все шейдеры упакованы в один пакет, все модели упакованы в один пакет, а все материалы упакованы в один пакет
3. Группировать по использованию
объединяет все ресурсы, используемые в определенное время, в один пакет. Его можно разделить по уровням: все ресурсы, необходимые для уровня, включая персонажей, текстуры, звуки и т. Д., Сгруппированы в пакет. Его также можно разделить на сцены, один пакет ресурсов, необходимых для одной сцены

Упаковка зависимостей

Это означает, что, например, если две модели используют один и тот же материал и текстуру, то между моделью и картой текстуры существует отношение зависимости. Если наши две модели упакованы отдельно, тогда будут упакованы два материала и текстуры, так что пакет станет больше, тогда как мы его решим, вот способ в Unity, на который в первую очередь нужно положиться Упакуйте материалы и текстуры отдельно в папку, а затем упакуйте две модели, которые зависят от этого материала и текстуры. Таким образом, Unity будет искать карту материалов и обнаруживать, что материал и текстура были упакованы, поэтому не будет повторять упаковку материала и текстуры, что значительно уменьшает размер упаковки.


Вышеупомянутый метод предназначен для непосредственной упаковки двух моделей по отдельности. Вы можете видеть, что материалы и текстуры упакованы отдельно, каждый из которых составляет 63 КБ, а следующий — первый пакет материалов и текстур до 62 КБ. Затем упакуйте две модели по 2 КБ, а общий размер составит всего 64 КБ.

Это пакет зависимостей, поставляемый с Unity.
Но модель, материал и текстура должны быть загружены при загрузке, иначе будут финансовые потери.

using UnityEngine;
public class LoadFromFileExample: MonoBehaviour {
  void Start() {
    AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/cube.ab");
    AssetBundle abShare = AssetBundle.LoadFromFile("AssetBundles/share.ab"); //GameObject go = ab.LoadAsset<GameObject>("Cube");    
    //Instantiate(go);                
    Object[] obj = ab.LoadAllAssets < GameObject > (); // Загружаем и помещаем в массив                 // Создано
    foreach(Object o in obj) {
      Instantiate(o);
    }
  }
}

Удаление AssetBundle

Есть два аспекта для удаления
1. Уменьшите использование памяти.
2, может привести к потере
Итак, когда удалять ресурсы
AssetBundle.Unload (true) Выгрузить все ресурсы, даже если ресурсы используются
1. При переключении между уровнями и сценами
2, когда ресурс не вызывается
AssetBundle.Unload (false) Выгрузить все неиспользуемые ресурсы
Как удалить отдельные ресурсы
1 через Resources.UnloadUnusedAssets.
2, когда сцена переключается

Проверка документов

Проверка файла может гарантировать целостность файла во время передачи файла. Например, A сгенерирует проверочный код перед передачей мне файла. Для этого файла будет сгенерирован только этот уникальный проверочный код, если он будет передан мне. Если файл немного отличается, код проверки будет совершенно другим. Поэтому, когда A передает мне файл, мне будут переданы и файл, и контрольный код. Когда я получу файл, я также буду использовать тот же алгоритм, что и A, для генерации контрольного кода файла, а затем возьму этот Значение сравнивается с контрольным кодом, который мне прислал A, если он совпадает, значит, файл готов, если нет, то повторите передачу. Ниже приведены контрольные значения, сгенерированные несколькими алгоритмами.
CRC MD5 SHA1
Сходства:
Все CRC, MD5, SHA1 вычисляются путем вычисления данных для создания контрольного значения, которое используется для проверки целостности данных.
Разница:

  1. Алгоритм другой. CRC использует полиномиальное деление, MD5 и SHA1 используют подстановку, вращение и другие методы;
  2. Длина контрольного значения разная. Длина контрольного бита CRC зависит от его полинома, обычно 16 или 32 бита; MD5 — 16 байтов (128 бит); SHA1 — 20 байтов (160 бит);
  3. Имя контрольного значения другое. CRC обычно называется значением CRC, MD5 и SHA1 обычно называются хеш-значением (Hash) или хеш-значением;
  4. Безопасность бывает разной. Безопасность здесь означает способность обнаруживать ошибки, то есть ошибки данных могут быть обнаружены с помощью контрольного бита. Безопасность CRC во многом связана с полиномами и намного слабее, чем MD5 и SHA1; MD5 очень безопасен, но он был взломан Ван Сяоюном из Университета Шаньдун в 2004 году; SHA1 имеет самую высокую безопасность.
  5. Эффективность разная, эффективность вычисления CRC очень высока, MD5 и SHA1 относительно медленны.
  6. Различное использование. CRC обычно используется для проверки данных связи; MD5 и SHA1 используются в области безопасности, такой как проверка файлов и цифровые подписи.

2 комментария к “Ассет бандлы и адрессаблы. Для чего используются и есть ли опыт разработки с их использованием?

  1. почему у меня не работает? Я сделал все абсолютно также но при нажатии на верхнюю кнопку Asset Bundle и там на кнопку Build Asset Bundles у меня ничего не создаеться в папке scene

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *