1、博文介绍
2、具体思路和写法
(1)AB包的打包
(2)AB包的加载
(3)AB包卸载
3.资源包下载
4.推送
5.结语
本篇博客主要起记录和学习作用,简单的介绍一下AB包的打包和几种不同方法加载AB包的方式,若各位同学有幸看到本篇博客,希望能够对你有所帮助。
打包这里就不在做过多的介绍,直接拷贝官方的方法,很简单也很直观,这里只要注意在Unity内为资源设置好名字和后缀就好了,在资源商店里有一个免费的AB包管理软件,评价好像挺高的,博主回头抽时间研究一下,再写一篇文章介绍一下吧(完了,不知不觉又立了个flag)。
using UnityEditor;
using System.IO;
///
/// time:2019/1/19
/// author:King.Sun
/// description:AB包打包
///
public class LoadAB{
[MenuItem("Assets/Bulid AssetBundle")]
static void BuildAssetBundle()
{
//创建目录
string abPath = "Assets/AssetBundles";
if (!Directory.Exists(abPath))
{
Directory.CreateDirectory(abPath);
}
//打包 os/win
#if UNITY_STANDALONE_WIN
BuildPipeline.BuildAssetBundles(abPath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
#elif UNITY_STANDALONE_OSX
BuildPipeline.BuildAssetBundles(abPath, BuildAssetBundleOptions.None, BuildTarget.StandaloneOSX);
#endif
}
}
这里我就直接本地加载了,考虑到同学你用的是win还是mac这里加了个宏,不同平台打包设定是不一样的,同学用到了自行查API,打包就不细说了。
博主这里将一个Cube打到一个AB包里,包名为cube.unity3d,后缀为assetbundle。
打包后就可以看到在我们设定的目录下,生成了cube.unity3d的AB包和对应的manifest描述文件,描述文件内记载了,我们该AB包里的资源和依赖,至此打包工作完成
这里我们通过本地路径来加载AB包,不同平台下的路径是不同的这里需要各位同学去注意一下
//不同平台下路径不同
#if UNITY_ANDROID
_abPath = "jar:file://" + Application.dataPath + "!/assets/AssetBundles/";
#elif UNITY_IPHONE
_abPath = Application.dataPath + "/Raw/AssetBundles/";
#elif UNITY_STANDALONE_WIN || UNITY_EDITOR
_abPath = Application.dataPath + "/AssetBundles/";
#else
_abPath = string.Empty;
#endif
这里我们为我们的AB包路径 _abPath赋值。
加载方式1: LoadFromMemoryAsync 异步加载,通过LoadFromMemoryAsync加载从服务器或本地获取的字节流来加载
StartCoroutine(LoadABPackage1(_abPath));
IEnumerator LoadABPackage1(string path)
{
AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path+"cube.unity3d.assetbundle"));
yield return request;
ab = request.assetBundle;
Object cube = ab.LoadAsset("Cube.prefab");
Instantiate(cube);
}
加载方式2:LoadFromMemory 同步加载,通过LoadFromMemoryAsync加载从服务器或本地获取的字节流来加载
LoadABPackage2();
void LoadABPackage2()
{
ab = AssetBundle.LoadFromMemory(File.ReadAllBytes(_abPath+"cube.unity3d.assetbundle"));
Object cube = ab.LoadAsset("Cube.prefab");
Instantiate(cube);
}
加载方式3:LoadFromFileAsync 直接通过本地路径异步加载,只能加载本地AB包
StartCoroutine(LoadABPackage3(_abPath));
IEnumerator LoadABPackage3(string path)
{
AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(path+"cube.unity3d.assetbundle");
yield return request;
ab = request.assetBundle;
Object cube = ab.LoadAsset("Cube.prefab");
Instantiate(cube);
}
加载方式4:LoadFromFile 直接通过本地路径同步加载,只能加载本地AB包
LoadABPackage4(_abPath);
void LoadABPackage4(string path)
{
ab = AssetBundle.LoadFromFile(path + "cube.unity3d.assetbundle");
Object cube = ab.LoadAsset("Cube.prefab");
Instantiate(cube);
}
加载方式5:WWW异步加载方法 本地服务器均可
StartCoroutine(LoadABPackage5(_abPath));
IEnumerator LoadABPackage5(string path)
{
WWW www = WWW.LoadFromCacheOrDownload(path+"cube.unity3d.assetbundle",1);
yield return www;
if (!string.IsNullOrEmpty(www.error))
{
Debug.Log(www.error);
yield break;
}
ab = www.assetBundle;
Object cube = ab.LoadAsset("Cube.prefab");
Instantiate(cube);
}
加载方式6:UnityWebRequest 异步加载方式 本地服务器均可
StartCoroutine(LoadABPackage6(_abPath));
IEnumerator LoadABPackage6(string path)
{
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(path+"cube.unity3d.assetbundle");
yield return request.Send();
ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
Object cube = ab.LoadAsset("Cube.prefab");
Instantiate(cube);
}
AssetBundle.Unload(false),卸载AB包资源,同时保留内存中已加载的资源;
AssetBundle.Unload(true),卸载AB包资源,同时卸载内存中已加载的资源,会造成资源的丢失
完整工程下载:https://download.csdn.net/download/mr_sun88/10927709
先空着
本篇博客只是简单的介绍了AB包的打包和加载,希望有幸看到本篇文章的同学能有所收获,另博主能力有限,文中若有错误的地方期望各位看家可以指点交流。
QQ交流群:806091680(Chinar)
该群为CSDN博主Chinar所创,推荐一下!我也在群里!
本文属于原创文章,转载请著名作者出处并置顶!!!!!