创建脚本:
//第一步 加载AB包
AssetBundle.LoadFromFile();//里面应该传AB包路径
打包时我们默认的打包路径是Assets同级下的AssetBundles内的文件,例如上一次打包的PC
还有一个就是因为我们选择了Copy to StreamingAssets所以它会在Asset下创建一个文件夹
我们为什么需要拷贝到StreamingAssets呢?
我们需要知道,当我们打包时,Assets同级下的AssetBundles内的文件是不会被打包出去的。
StreamingAssets文件夹会随着U3D打包而打包。它不会对里面的文件进行压缩加密和Resources不一样。在PC平台可读可写,IOS和Android是只读的。
StreamingAssets文件夹路径怎么获取呢?
公共类中提供了:
Application.streamingAssetsPath//在不同平台下得到StreamingAssets路径
//第一步 加载AB包
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath+"/"+"model");
//"/"可以"\\"代替不可以用"\"这个是转义符,+"包名"此处streamingAssetsPath内包明为model
不用泛型加载对象是Object,这样会造成一个问题。只用名字加载会出现 同名不同类型资源分不清
因此推荐使用泛型的形式来加载
//第二步 加载AB包中的资源
GameObject obj = ab.LoadAsset<GameObject>("Cube");
然后生成加载的对象
Instantiate(obj);
运行脚本:
AB包不能重复加载 否则报错
//AB包不能够重复加载 否则报错
//AssetBundle ab2 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");//加载一个圆,由于我们已经加载了AB包,因此就省略了第一步
GameObject obj2 = ab.LoadAsset("Sphere", typeof(GameObject)) as GameObject;
Instantiate(obj2);
以上都是同步加载
异步加载->携程
创建携程
StartCoroutine(LoadABRes("head", "Sphere"));
IEnumerator LoadABRes(string ABName,string resName)
{
//第一步 加载AB包
AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + "ABName");
yield return abcr;
//第二部 加载资源
AssetBundleRequest abq = abcr.assetBundle.LoadAssetAsync("resName", typeof(GameObject));
yield return abq;
GameObject sp = abq.asset as GameObject;//abq.asset得到资源
Instantiate(sp);
}
卸载AssetBundle(AB包)
AssetBundle.UnloadAllAssetBundles(true);如果为true的话,场景中有东西是AB包加载的话,那些东西也会被卸载。false只卸载AB包
void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
AssetBundle.UnloadAllAssetBundles(true);
}
}
单独卸载model包(包含正方形的包)
ab.Unload(false);和上面一样,当为true时AB包加载的也会消除
1、如何解决AB包不允许重复加载的问题?
用字典记录已加载的AB包,如果存在则不重复加载
如果要记录,那么一定要提供卸载的方法