Unity3D---AssetBundle打包

xiaoxiao2021-02-28  42

一、AssetBundle概述

用处:用于压缩包括model,texture,material,prefabs,甚至整个scene的资源,在游戏运行时再加载出来

AssetBundle(简称AB)打包特点:

1.保存资源之间相互依赖的关系

2.AB压缩算法分为:LZMA算法和LZ4算法,也可以不压缩

3.可以把下载内容放到AB包中,减少安装包的大小

二、AB打包使用流程:

1.在Unity中指定资源的AB属性

2.编写代码通过Editor Scripts构建AB包(搜索资源是否带有AB标签)

3.上传AB包(服务器)

4.加载AB包

5.通过AB包获取包里面的内容

三、使用代码构建AB包

编写BuildAB.cs完成AB包的构建,代码如下

using System.IO; using UnityEditor; public class BuildAB { [MenuItem("Asset/Build AB")]//在菜单栏中创建函数入口 static void BuildAllAssetBundles() { //判断路径是否存在,system.id命名空间 string dir = "AssetBundles"; if(Directory.Exists(dir)==false) { Directory.CreateDirectory(dir); } //参数分别为1.path 2.压缩选项 3.目标平台 BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneOSX); } }

注意:构建AB包的脚本属于编辑器脚本,该脚本引用UnityEditor命名空间,必须放置在Editor/目录下,否则会出现"‘UnityEditor’ can not found"的Error

构建成功后目录下多出一个AssetBundle文件夹,文件夹下的路径根据AB标签以及后缀生成次级目录以及后缀名

四、使用AB包中的内容

当我们的AB包已经下载至本机时,通过代码获得AB包并对其操作,代码如下:

public class LoadAB : MonoBehaviour { void Start () { AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/prefabs/capsule.yes");//加载AB时,路径是定义的标签名 GameObject capsulePrefab = ab.LoadAsset<GameObject>("Capsule");//加载GameObject时name是prefab的名字 //对获得到的对象操作 Instantiate(capsulePrefab); } }获取所有资源: object[] objs = ab.LoadAllAssets(); foreach(object o in objs) { Debug.Log(o); }

五、通过服务器下载AB包

public class LoadAB : MonoBehaviour { IEnumerable Start () { string uri = @"127.0.0.1/AssetBundles/capsule.yes";//指定服务器地址 UnityWebRequest unityWebRequest = UnityWebRequest.GetAssetBundle(uri);//引用UnityEngine.Networking yield return unityWebRequest.SendWebRequest(); AssetBundle ab = DownloadHandlerAssetBundle.GetContent(unityWebRequest); } }

六、AB包的卸载

卸载有两点需要注意:

1.能够减少内存的使用

2.对卸载不进行规划的话可能造成丢失(依赖)

ab.Unload(true);//卸载所有资源 ab.Unload(false);//卸载未被使用的资源

七、Manifest文件的信息

构建AB包完成后,主要目录下生成一个主要的manifest文件,包含了该AB包的所有资源以及信息以及它们的依赖

而相同AB标签的物品中也能生成一个manifest,包含了该物品自身的依赖

manifest都包含CRC校验码用于校验文件是否完整

转载请注明原文地址: https://www.6miu.com/read-2622468.html

最新回复(0)