前面四篇讲解了打包AB的相关知识,思路和工程也都贴出了,由于功能代码量还是蛮多的,这里暂时就先不一一讲解了,注释的应该还是比较详细的。这一篇就主要讲解AB包的使用,总不能打好AB包而不会用吧。
如同Resource.Load()一般,读取AB的方法也很简单,AssetBundle.LoadFromFile(assetBundlePath),这个方法是官方推荐使用的,也是读取最快的。当然如果你的AB资源是放在服务器上做热更新用的,应该用WWW去读取,这边暂时不对此做详细的描述。通过上面的方法读取到AssetBundle对象后,自然要获取里面的Asset。使用assetBundle.LoadAsset(assetName)我们就可以获取到打包成AB前的Asset,进行使用。相关代码在工程里面Assets\Scripts\Utilities\AssetBundle文件夹内。
注意:AssetBundle对象其实只是存储AB包的文件信息,内存占用相对较小,只有LoadAsset时才读取AB包的内容到内存。
这里先讲讲关于AB的依赖,按照前面的内容,我们知道,如果一个UI界面上,用到一张图片。然后我们将其打包AB资源,需要打包成两个,一个是ui.ab,一个是image.ab,(ui.ab依赖于image.ab)。当我们获取ui.ab并且取出里面的Asset并实例化出来后,会发现里面的图片并不能显示出来。其原因在于,我们没有获取其依赖的image.ab。只要我们事先读取image.ab,生成对应的AssetBundle即可。同时我们根据前面的知识知道,AB包所有的依赖关系Unity都帮我们存好放在了与AB包父目录同名的文件当中(文中为StreamingAssets)。其实这个也是一个AB文件,我们只需要从程序运行的时候读取该AB,获取AssetBundleManifest对象存放在内存当中,然后每次读取AB包的时候都根据AB的包名从AssetBundleManifest对象中获取其相关依赖的包名获取对应AB即可。
注意:依赖的AB包,我们读取的时候只需要生成对应的AssetBundle对象,无需手动去LoadAsset我们需要的资源,Unity会自动替我们处理。
读取AssetBundleManifest的代码如下:
public static readonly string streamingAssetsFileName = "StreamingAssets";
static AssetBundleManifest m_mainfest;
static AssetBundleManifest mainfest {
get {
if(m_mainfest == null) {
AssetBundle ab = AssetBundle.LoadFromFile(streamingAssetsPath + "/" + streamingAssetsFileName);
if(ab != null) {
m_mainfest = (AssetBundleManifest)ab.LoadAsset("AssetBundleManifest");
//释放AssetBundle对象
ab.Unload(false);
ab = null;
} else {
Debug.LogError("Get Mainfest Error");
return null;
}
}
return m_mainfest;
}
}
/// <summary>
/// StreamingAssets 路径
/// </summary>
public static string streamingAssetsPath {
get {
#if UNITY_ANDROID
return Application.dataPath + "!assets"; // 安卓平台
#else
return Application.stre

最低0.47元/天 解锁文章
1375

被折叠的 条评论
为什么被折叠?



