必知:
①真正打包出去的时候,和Assets同级的文件夹AssetsBundle里面的资源肯定不会被打包出去。
②所以我们选择拷贝的StreamingAssets文件夹。会随着U3D打包出去的时候打包出去,不会对文件进行压缩。在PC平台可读可写,在IOS和Android只读。
AB包同步加载案例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ABTest : MonoBehaviour
{
//AB包同步加载案例:
void Start()
{
//第一步 加载AB包
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");
//第二部 加载AB包中的资源
//只是使用名字加载 会使用 同名不同类型资源 分不清
//建议大家用1泛型加载 或者 是 Type指定类型
GameObject obj = ab.LoadAsset<GameObject>("Cube");//此处利用泛型(Lua不支持泛型)
//GameObject obj = ab.LoadAsset("Cube", typeof(GameObject)) as GameObject;
//------>到此处只是加载出来而已
Instantiate(obj);//实例化
//AB包不能重复加载,否则报错
//卸载所有加载的AB包方法:
//1.为true时,场景中如果有资源是通过AB加载的,会一起被卸载(场景物体丢失)
//2.为false时,场景物体不管,只卸载AB包。
AssetBundle.UnloadAllAssetBundles(false);
//卸载单个AB包方法:
ab.Unload(false);
}
}
AB包异步加载案例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ABTest : MonoBehaviour
{
public Image img;
void Start()
{
//异步加载->协程
StartCoroutine(LoadABRes("image","image_1"));
}
IEnumerator LoadABRes(string ABName,string resName)
{
//第一步 加载AB包
AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + ABName);
yield return abcr;
//第二部加载资源
AssetBundleRequest abq = abcr.assetBundle.LoadAssetAsync(resName, typeof(Sprite));
yield return abq;
img.sprite = abq.asset as Sprite;
//此处两个yield return,至少要等待两帧
}
}