AB包介绍及导出工具实现+AB包资源简单加载
Resource原理
项目中建立Resources目录,资源导入内部
生成项目包
资源文件存储路径
结论:存储在Resources下的资源,最终会存储在游戏的主体包中,发送给用户,手机系统上,如果需要做资源的更新,是无法使用Resources即时更新(不需要关闭手机游戏,即可实现游戏更新)
崩坏3(应用商店重新下载)
王者荣耀(游戏内直接更新)
AssetBundle(简称AB包)
AB包是独立于游戏主包存在的资源存储文件,使用内部资源时,需要单独下载和加载 。
AB包和Resources的区别
存储
Resources内部资源存储在游戏的发布包中
AB包存储在独立的文件中(AB包存储在非特殊目录下时,不在游戏的发布包中)
加载
Resources内部资源使用Resources.Load();
AB包(可以理解为可下载的Resources)
*获得AB包文件(下载,解压streaming拷贝到可写目录)
通过AB包文件路径,加载AB包文件
通过名称(资源名称),加载内部资源
AssetBundle的定义
AssetBundle是把一些资源文件,场景文件或二进制文件以某种紧密的方式(浅显理解例:压缩包)保存在一起的一些文件。
AssetBundle内部不能包含C#脚本文件,AssetBundle可以配合Lua实现资源和游戏逻辑代码的更新
热更新
不关闭Unity应用的前提,实现游戏资源和代码逻辑的更新。
AB包的创建
资源导入项目
如果资源未来做更新(资源存储在AB包中),就不要将资源放置在Resources目录下
资源配置
选中需要添加AB包的资源,填写或选择已存在的AB包名称
AB包配置修改后或AB内部的资源修改后,都需要重新生成AB包
AB包导出工具
创建Editor文件夹,在该文件夹内编写Editor脚本导出AB包,具体代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;public class ExportAB
{[MenuItem("AB包/导出")]public static void Export(){//项目的Assets路径//D:/Unity_Project/GameUI/Assetsstring path = Application.dataPath;//D:/Unity_Project/GameUI/path = path.Substring(0, path.Length - 6)+"ab";Debug.Log(path);//防止路径不存在if(!Directory.Exists(path)){Directory.CreateDirectory(path);}//导出AB包的核心代码,生成AB包文件//参数1:AB包文件存储路径,参数2:导出选项,参数3:平台(不同平台AB包不同)BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);}
}
编辑器下执行如下:
选择导出后Unity开始为你导出AB包到预期的文件路径
AB包名称如果配置成这样的结构“ui/package",ui会作为AB包存储的父目录,package是AB包的名称
AB包压缩方式
不压缩:AB包比较大,加载速度快(CPU不用运算解压缩)
LZMA算法压缩:默认压缩模式,文件尺寸居中,加载速度居中
LZ4算法压缩:5.3以后可用,压缩比例高,文件小,加载速度偏慢
依赖关系
如果一个AB(名称A)包,使用到了另一个AB(名称B)包的资源,那么两个AB包就产生了依赖关系。也就是A依赖于B。
编写顶部菜单栏按钮
AB包分平台,所以导出的API不同
Android
iOS
Windows
Mac
BuildPipeline.BuildAssetBundles
AB存储路径
导出选项
None:无任何选项
UncompressedAssetBundle:默认LZMA,开启这个选项就不会压缩AB包
CollectDependencies:默认开启,开启依赖记录机制
在Unity中加载AB包文件
编写配置文件脚本Config和加载脚本,对应代码如下:
//配置文件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Config
{//配置AB包存储的路径public static string ABPath = Application.dataPath.Substring(0, Application.dataPath.Length-6)+"ab";
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class SimpleLoad : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){//第一步加载ab文件AssetBundle ab = AssetBundle.LoadFromFile(Config.ABPath+"/test3");//Debug.Log(Config.ABPath + "/test1");//第二步加载资源Sprite sp = ab.LoadAsset<Sprite>("Item");Debug.Log(sp.name);GameObject.Find("/Canvas/Image").GetComponent<Image>().sprite=sp;}
}
运行结果如下所示:
发现已导出的AB包文件可正常加载 。
该系列专栏为网课课程笔记,仅用于学习参考。