AssetBundle,一般称为ab包,是Unity提供的一种资源存储格式。近几个版本的Unity内置ab包的打包工具,在编辑器内可以很方便地进行模型,材质,音乐,动画等资源的打包,一个预制体被打包后,相关依赖项(组件内使用到的资源)也会合并在一起。但脚本不会被打包,预制体上只会保留一个指向脚本的路径。
 
 
对于服务端,资源可以分布到多个ab包中,存储位置灵活,支持热更新。
 对于客户端,可以根据游戏的进程随取随用,节约客户端的内存。
流程参考b站上的 视频教学 在视频中,将资源打包为ab包的步骤很简单,首先,在Assets下选择一个准备打包的对象(非脚本),在编辑器中的Inspector面板底部的AssetBudle右选择New…新建包名,命名后为其选中。例如:

编写脚本,脚本代码如下:
using UnityEditor;
public class BuildAssetsBundle : Editor
{
    [MenuItem("Build/AssetsBundle")]
    static void BuildAllAssetsBundle()
    {
        BuildPipeline.BuildAssetBundles("./AssetsBundles/win64",BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);
    }
}
脚本定义了一个顶部菜单栏的新项“Build/AssetsBundle”,点击后调用函数 BuildAllAssetsBundle。
其中,使用到了BuildPipeline类,该类主要用于以编程方式构建可从 Web 加载的Player或 AssetBundle,详见 文档。
具体的打包使用的是BuildPipeline类下的BuildAssetBundle函数,详见 文档。在示例代码中传入了三个参数,分别代表打包出的ab包输出地址,ab包构建选项( 可选择),以及目标平台。
代码保存后,在菜单栏点击“Build/AssetsBundle”执行打包后,能看到输出文件夹中新增的ab包文件。
在上传的步骤中,把ab包文件放到服务器上

 若文件上传成功,在浏览器中输入文件路径访问后,结果是能下载得到ab包
在 官方教程中(4.3),列举了脚本中下载解析ab包的方法:
 AssetBundle.LoadFromMemory,AssetBundle.LoadFromFile,AssetBundleDownloadHandler,WWW.LoadFromCacheOrDownload等。

 代码;
using UnityEngine;
public class request : MonoBehaviour
{
    private void Start()
    {
        Http http = new();
        StartCoroutine(http.webRequest("192.168.5.127/remote/win64/gameui", (build)=>
        {
            GameObject gameObject = build.asset as GameObject;
            Instantiate(gameObject, transform.Find("Canvas"));
        }));
    }
}
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class Http
{
    public IEnumerator webRequest(string url, Action<AssetBundleRequest> action)
    {
        while (!Caching.ready)
            yield return null;
        using (UnityWebRequest uwr = UnityWebRequestAssetBundle.GetAssetBundle(url))
        {
            yield return uwr.SendWebRequest();
            if (uwr.isDone)
            {
                if (uwr.isNetworkError || uwr.isHttpError)
                {
                    Debug.LogError("资源:" + url + "加载失败");
                }
                else
                {
                    AssetBundle ab = DownloadHandlerAssetBundle.GetContent(uwr);
                    AssetBundleRequest tempAb = ab.LoadAllAssetsAsync(typeof(GameObject));
                    yield return tempAb;
                    if (tempAb != null)
                    {
                        if (action != null)
                            action(tempAb);
                        ab.Unload(false);
                    }
                    else
                    {
                        // 加载失败处理
                        Debug.LogError("资源:" + url + "加载失败");
                    }
                }
            }
            else
            {
                yield return new WaitForEndOfFrame();
            }
        }
    }
}

                
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删