赞
踩
可以归为两点:
它是一个存在于硬盘上的文件。可以称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。这些文件可以分为两类:serialized file(序列化文件) 和 resource files(资源文件);
serialized file:资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个);
resource files:某些二进制资源(图片、声音)被单独保存,方便快速加载。
它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包加载出来的对象.这个对
象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用。
构建时unity是根据AssetBundle的标签进行工作的,所有构建之前需要对要打成Asset Bundle的对象指定AssetBundle标签;
new:新增标签,格式xx/xx/xx代表路径,构建后在保存在对应路径下;
Remove Unused Names:移除未使用的标签;
后缀可随意,也可不设置,没有影响。适当的定义后缀,可在一定程度上防止被别人破解资源。
标签一经创建不可改名,写错的话,只能取消使用,移除后重新创建。
AssetBundle构建API
//assetbundle保存路径文件夹
string tarPath = "AssetBundles";
//若文件夹不存在,需要先创建文件夹,不会自动创建
if (!Directory.Exists(tarPath))
Directory.CreateDirectory(tarPath);
//构建Asset Bundles
BuildPipeline.BuildAssetBundles(tarPath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
tarPath 目标路径
BuildAssetBundleOptions 压缩方式
注意:使用LZ4压缩,可以获得可以跟不压缩想媲美的加载速度,而且比不压缩文件要小
BuildTarget 目标平台
游戏中有很多复用的资源,图中两个对象分别使用了相同的资源,分别打成assetbundle,资源就会打两份,包体会变大;我们可以把公用的资源打在一起,独有的信息另外单独打在一起,就有了依赖,两个prefab分别依赖于材质的assetbundle。
从本地加载
同步加载(AssetBundle.LoadFromFile)
/// <summary>
/// 从本地同步加载
/// </summary>
void RealCreateFromLoacl()
{
string cubeAbPath = "AssetBundles/wall/cubewall.unity";
AssetBundle ab = AssetBundle.LoadFromFile(cubeAbPath);
GameObject obj = ab.LoadAsset<GameObject>("cubewall");
Instantiate(obj);
}
异步加载(AssetBundle.LoadFromFileAsync)
/// <summary>
/// 从本地异步加载
/// </summary>
/// <returns></returns>
IEnumerator AsyncCreateFromLocal ()
{
string cubeAbPath = "AssetBundles/wall/cubewall.unity";
AssetBundleCreateRequest abRequest = AssetBundle.LoadFromFileAsync(cubeAbPath);
yield return abRequest;
AssetBundle ab = abRequest.assetBundle;
GameObject obj = ab.LoadAsset<GameObject>("cubewall");
Instantiate(obj);
}
从内存中加载
同步加载(AssetBundle.LoadFromMemory)
/// <summary>
/// 从内存中同步加载
/// </summary>
void RealLoadFromMemory()
{
string cubeAbPath = "AssetBundles/wall/cubewall.unity";
//读取字节流
byte[] abBytes = File.ReadAllBytes(cubeAbPath);
AssetBundle ab = AssetBundle.LoadFromMemory(abBytes);
GameObject obj = ab.LoadAsset<GameObject>("cubewall");
Instantiate(obj);
}
异步加载(AssetBundle.LoadFromMemoryAsync)
/// <summary> /// 从内存中异步加载 /// </summary> /// <returns></returns> IEnumerator AsyncLoadFromMemory() { string cubeAbPath = "AssetBundles/wall/cubewall.unity"; //读取字节流 byte[] abBytes = File.ReadAllBytes(cubeAbPath); AssetBundleCreateRequest abRequest = AssetBundle.LoadFromMemoryAsync(abBytes); yield return abRequest; AssetBundle ab = abRequest.assetBundle; GameObject obj = ab.LoadAsset<GameObject>("cubewall"); Instantiate(obj); }
WWW.LoadFromCacheOrDownload 加载
/// <summary> /// 通过www加载 /// </summary> /// <returns></returns> IEnumerator LoadFormWWW () { // 缓存是否准备好 while(!Caching.ready) { yield return null; } //参数为:网址/路径,版本号 WWW www = WWW.LoadFromCacheOrDownload(@"file://F:\Save\Unity_project\Unity_2018\Asset Bundle One\AssetBundles\wall\cubewall.unity", 1); yield return www; //检查报错 if (!string.IsNullOrEmpty(www.error)) { Debug.Log(www.error); yield break; } AssetBundle ab = www.assetBundle; GameObject obj = ab.LoadAsset<GameObject>("cubewall"); Instantiate(obj); }
UnityWebRequest 加载
/// <summary> /// 通过 UnityWebRequest 加载 /// </summary> /// <returns></returns> IEnumerator LoadFormWebRequest() { string url = @"file://F:\Save\Unity_project\Unity_2018\Asset Bundle One\AssetBundles\wall\cubewall.unity"; UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url); yield return request.SendWebRequest(); //方式一 //AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request); //方式二 AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle; GameObject obj = ab.LoadAsset<GameObject>("cubewall"); Instantiate(obj); }
AB 加载方式:
从AB中加载资源:
依赖包加载
/// <summary> /// 依赖AB加载 /// </summary> void LoadRelyAB () { string cubeAbPath = "AssetBundles/wall/cubewall.unity"; AssetBundle ab = AssetBundle.LoadFromFile(cubeAbPath); GameObject obj = ab.LoadAsset<GameObject>("cubewall"); //获取依赖信息 AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles"); AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); string[] strs = manifest.GetAllDependencies("wall/cubewall.unity"); //加载所有依赖AB foreach(string name in strs) { AssetBundle.LoadFromFile("AssetBundles/" + name); } Instantiate(obj); }
卸载有两个方面
卸载时机
策略
逻辑实体分组
按照类型分组
按照使用分组
建议
注意:在加载这些包之前,也需要加载依赖的包,不然会丢失这部分内容,显示效果不正确
Github地址,工程中工具位置是 Window/AssetBundle Browser
configure 中可以查看所有 AB 信息
build 里可进行打包
Build Target 用于设置AB包的目标平台,OutPut Path 设置AB的输出路径,Build 一键打包
本文说明的只是一些Asset Bundle的基础知识和用法参考文章,商业项目中一般不会这样使用,而是使用针对自己项目的自动化处理工具,以期准确高效的推进进度。但是这些基础知识却也是前提。
之后我也会去研究学习一些商业的使用,有了总结会在这里贴出来的–>>修建中的传送门、、、。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。