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();
}
}
}
}
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删