[Unity 3D] Упаковка AssetBundle, загрузка, загрузка и выгрузка подробного объяснения и демонстрации (исходный код прилагается)

Если вам нужен исходный код и зависимости, поставьте лайк, подпишитесь и оставьте личное сообщение в области комментариев после его получения ~~~

Наиболее важной операцией AssetBundle является упаковка, загрузка, загрузка и выгрузка AssetBundle. Давайте узнаем об общих операциях AssetBundle.

1: Упаковка AssetBundle

Упаковка AssetBundle в основном использует следующие два API:

BuildAssetBundles(строка outputPath,AssetBundleBuild[] строит,

BuildAssetBundleOptions assetsBundleOptions, BuildTarget targetPlatform);

BuildAssetBundles (строка outputPath, BuildAssetBundleOptions assetsBundleOptions, BuildTatget targetPlarform);

 Затем создайте новый скрипт PackBundles.cs и поместите его в папку Editor.Код выглядит следующим образом:

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

public class PackBundles : Editor
{
    //选定资源打包
    [MenuItem("PackBundles/PackBundles")]
    static void PutBundleAssetes()
    {
        //初始化一个AssetBundleBuild表
        List<AssetBundleBuild> buildMap = new List<AssetBundleBuild>();
        AssetBundleBuild build = new AssetBundleBuild();
        //设置AssetBundleBuild的名字和资源路径
        build.assetBundleName = "tempImg.unity3d";
        build.assetNames = new[] { "Assets/Textures/tempImg.jpg" };
        //添加进表
        buildMap.Add(build);

        //将这些资源包放在一个名为ABs的目录下        
        string assetBundleDirectory = "Assets/ABs";
        //如果目录不存在,就创建一个目录        
        if (!Directory.Exists(assetBundleDirectory))
        {
            Directory.CreateDirectory(assetBundleDirectory);
        }
        //资源打包
        BuildPipeline.BuildAssetBundles(assetBundleDirectory, buildMap.ToArray(), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
    }
}

Все ресурсы упакованы

Перед упаковкой всех ресурсов необходимо задать свойства каждого ресурса, который необходимо упаковать.Затем мы модифицируем скрипт PackBundles.cs, чтобы добавить выбранный блок упаковки ресурсов и все функции упаковки ресурсов.

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

public class PackBundles : Editor
{
    //选定资源打包
    [MenuItem("PackBundles/PackBundles")]
    static void PutBundleAssetes()
    {
        //初始化一个AssetBundleBuild表
        List<AssetBundleBuild> buildMap = new List<AssetBundleBuild>();
        AssetBundleBuild build = new AssetBundleBuild();
        //设置AssetBundleBuild的名字和资源路径
        build.assetBundleName = "tempImg.unity3d";
        build.assetNames = new[] { "Assets/Textures/tempImg.jpg" };
        //添加进表
        buildMap.Add(build);

        //将这些资源包放在一个名为ABs的目录下        
        string assetBundleDirectory = "Assets/ABs";
        //如果目录不存在,就创建一个目录        
        if (!Directory.Exists(assetBundleDirectory))
        {
            Directory.CreateDirectory(assetBundleDirectory);
        }
        //资源打包
        BuildPipeline.BuildAssetBundles(assetBundleDirectory, buildMap.ToArray(), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
    }
    //全部打包
    [MenuItem("PackBundles/AllPackBundles")]
    static void PutBundleAssetesAll()
    {
        //将这些资源包放在一个名为ABs的目录下        
        string assetBundleDirectory = "Assets/ABs";
        //如果目录不存在,就创建一个目录        
        if (!Directory.Exists(assetBundleDirectory))
        {
            Directory.CreateDirectory(assetBundleDirectory);
        }
        BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
    }
}

Выберите команду PackBundles->AllPachBundles в строке меню. Вы можете увидеть файл AssetBundle, созданный в папке ABs в представлении проекта. Вы можете видеть, что упакованные файлы имеют характеристику, то есть каждый пакет ресурсов AssetBundle будет иметь суффикс именованный .manifest.document

2: Файл манифеста

Файл манифеста на самом деле представляет собой отношение зависимости файла ресурса AssetBundle и файла записи информации о пакете. На основе этого файла вы можете получить отношение зависимости определенного пакета или определить размер полученного пакета, а также код проверки нормальный.Используйте текст для этого файла.Открыв редактор, вы увидите содержимое файла

CRC: код подтверждения, используемый для проверки комплектности пакета.

Активы: указывает, сколько ресурсов включено в пакет.

Зависимости: указывает зависимости пакета.

3. Загрузка файла AssetBundle 

Затем используйте IIS для создания локального сервера.

1. Откройте следующий интерфейс в Windows.

2. Откройте IIS и создайте новый веб-сайт. Задайте имя веб-сайта, номер порта и физический путь. Установите физический путь на путь, по которому хранится файл ресурсов AssetBundle.

 3. Установите свойства IIS

4. Поместите созданный файл AssetBundle в папку по заданному физическому пути и удалите файл с суффиксом .meta.

 4. Загрузка AssetBundle

Существует четыре способа загрузки AssetBundle:

AssetBundle.LoadFromFile:Загрузить из локального

AssetBundle.LoadFromMemory загружается из памяти

WWW.LoadFromCacheOrDownload загружается и помещается в кэш для дальнейшего использования.

UnityWebRequest загружается с сервера

Создайте новый скрипт ниже, чтобы загрузить файл AssetBundle.

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

public class LoadBundles : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Load());
    }

    IEnumerator Load()
    {
        //从远程服务器上进行下载和加载
        string url = "http://localhost:8090/cube.unity3d";
        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
        //等待文件下载完毕
        yield return request.SendWebRequest();
        AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
        //加载AssetBundle资源
        AssetBundleRequest ABrequest = bundle.LoadAssetAsync("Cube.prefab", typeof(GameObject));
        //根据资源生成文件
        Instantiate(ABrequest.asset as GameObject, new Vector3(0f, 0f, 0f), Quaternion.identity);
        yield return ABrequest;
        //释放资源
        request.Dispose();
    }
}

 5. Удаление AssetBundle

Также существует четыре способа удаления AssetBundle.Код нового тестового скрипта выглядит следующим образом:

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

public class LoadBundles : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Load());
    }

    IEnumerator Load()
    {
        //从远程服务器上进行下载和加载
        string url = "http://localhost:8090/cube.unity3d";
        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
        //等待文件下载完毕
        yield return request.SendWebRequest();
        AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
        //加载AssetBundle资源
        AssetBundleRequest ABrequest = bundle.LoadAssetAsync("Cube.prefab", typeof(GameObject));
        //根据资源生成文件
        GameObject go = Instantiate(ABrequest.asset as GameObject, new Vector3(0f, 0f, 0f), Quaternion.identity);
        yield return ABrequest;
        //释放资源
        request.Dispose();

        //卸载资源 包含所有Load创建出来的对象
        bundle.Unload(true);
        //卸载资源 除了Load创建出来的对象
        bundle.Unload(false);
        //释放已加载的资源Object
        Resources.UnloadAsset(go);
        //卸载所有没有被场景引用的资源对象
        Resources.UnloadUnusedAssets();
    }
}

6. Инструмент упаковки AssetBundle

Мы можем использовать плагин Unity AssetBundle Browser Tool для просмотра AssetBundle, чтобы помочь упаковать AssetBundle и просмотреть содержимое AssetBundle.

Создать его непросто. Если оно вам помогло, ставьте лайк, подписывайтесь и собирайте~~~

Supongo que te gusta

Origin blog.csdn.net/jiebaoshayebuhui/article/details/128591347
Recomendado
Clasificación