AssetBundle入门使用

149 阅读2分钟

介绍

参考unity链接

  • AssetBundle 是一个存档文件,包含可在运行时由 Unity 加载的特定于平台的非代码资源(比如模型、纹理、预制件、音频剪辑甚至整个场景)。AssetBundle 可以表示彼此之间的依赖关系;例如,一个 AssetBundle 中的材质可以引用另一个 AssetBundle 中的纹理。

  • 为了提高通过网络传输的效率,可以根据用例要求(LZMA 和 LZ4)选用内置算法选择来压缩 AssetBundle。

  • AssetBundle 可用于可下载内容(DLC),减小初始安装大小,加载针对最终用户平台优化的资源,以及减轻运行时内存压力。

  • 是一个AssetBundle对象:通过代码从特定压缩包加载出来的对象。这个对象包括了所有内容,可以通过对象加载出来使用

  • 在硬盘上:一个文件夹压缩包,里面包括多个文件。

    • serialized file(序列化文件):资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个
    • resource files(源文件):某些二进制资源(图片、声音)被单独保存,方便快速加载(可以独立打开,不依附unity)

image.png

使用流程

一共四步:

第一步: 为 AssetBundle 分配资源

  • 指定资源的AssetBundle属性(是否需要打包)
  • 如果起名字为“scenes/wall“,这里scenes打包时会生成目录,名字为wall”

image.png

第二步:构建AssetBundle包

  • 创建Editor文件夹,并将包含以下内容的脚本放在该文件夹中:

    using UnityEditor;
    using System.IO;
    
    public class CreateAssetBundles
    {
        //方法放到菜单选项里,可以直接调用
        [MenuItem("Assets/Build AssetBundles")]
        static void BuildAllAssetBundles()
        { 
            //要创建在哪个 目录。如果不存在,创建这个目录
            string assetBundleDirectory = "AssetBundleProject/AssetBundles";
            if(!Directory.Exists(assetBundleDirectory))
                Directory.CreateDirectory(assetBundleDirectory);
    
            //BuildPipeline是UnityEditor下的类
            BuildPipeline.BuildAssetBundles(assetBundleDirectory, 
                                            BuildAssetBundleOptions.None, 
                                            BuildTarget.StandaloneWindows);
        }
    }
    

    结果如下:打包成功 | image.png | image.png | | --- | --- |

第三步:上传AB包到服务器

第四步:从服务器 加载AB包和包里的资源

  • 本地加载AB包
    • 挂一个脚本,写如下代码

image.png

using System.IO;
using UnityEngine;

public class LoadFromFileExample : MonoBehaviour
{
    void Start()
    {
        
       
        
        
        var myLoadedAssetBundle = AssetBundle.LoadFromFile(“AssetBundles/scene/wall.unity3d”);

        if (myLoadedAssetBundle == null)
        {
            Debug.Log("Failed to load AssetBundle!");
            return;
        }
        //加载所有资源可以这样写
        //Object[] objs = ab.LoadAllAssets();
        //foreach(Object o in objs){
        //    Instantiate(o);
        //}
        
        var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("MyObject");
        Instantiate(prefab); // 实例化该物体
    }
}

UnityWebRequestAssetBundle 从服务器下载

  • 创造一个网页请求,来下载和加载AssetBundle
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class DownloadExample : MonoBehaviour
{
    IEnumerator Start()
    {
        string uri = "https://myserver/myBundles/bundle123"; 
        uint crc = 1098980; // Expected content CRC

        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(uri, crc);
        yield return request.SendWebRequest();

        AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
        var loadAsset = bundle.LoadAssetAsync<GameObject>("Assets/Players/MainPlayer.prefab");
        yield return loadAsset;

        Instantiate(loadAsset.asset);
    }
}